Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XML сериализация / 2 сообщений из 2, страница 1 из 1
21.03.2014, 18:10
    #38593201
wizzzi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML сериализация
Имеется абстрактный класс CatalogItem, у него 3 наследника:BookCatalogItem, NewspaperCatalogItem, PattentCatalogItem.
Необходимо сериализовать следующий к класс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
[XmlInclude(typeof(BookCatalogItem))]
    [XmlInclude(typeof(NewspaperCatalogItem))]
    [XmlInclude(typeof(PattentCatalogItem))]
    [XmlRoot("Catalog", Namespace="https://Kashin/CatalogSchema.xsd")]
    [XmlInclude(typeof(CatalogItem))] 
    public class CatalogList: List<CatalogItem>
    {
    }



Сериализую уего следующим образом:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
     CatalogList cl = new CatalogList();
            cl.Add(new BookCatalogItem("AAAA1", "BBBB", "CCC", "DDDD", DateTime.Now, 10, "dddd", "789-1-12-123456-1"));
            cl.Add(new PattentCatalogItem("dasd", "asdq", "Russia", 29, DateTime.Now.Date, DateTime.Now, 20, "dsada"));
            cl.Add(new BookCatalogItem("AAAA", "BBBB", "CCC", "DDDD", DateTime.Now.Date, 10, "dddd", "789-1-12-123456-3"));
 
            XmlSerializer xs = new XmlSerializer(typeof(CatalogList));
            using (StreamWriter s = new StreamWriter("catalog.xml"))
                xs.Serialize(s, cl);



На выходе получаю:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version="1.0" encoding="utf-8"?>
<Catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="https://Kashin/CatalogSchema.xsd">
  <CatalogItem xsi:type="Book">
    <Title>AAAA1</Title>
    <Page>10</Page>
    <Author>BBBB</Author>
    <City>CCC</City>
    <Issue>DDDD</Issue>
    <DateIssue>2014-03-21T09:24:51.4555401+04:00</DateIssue>
    <PS>dddd</PS>
    <ISBN>789-1-12-123456-1</ISBN>
  </CatalogItem>
  <CatalogItem xsi:type="Pattent">
    <Title>dasd</Title>
    <Page>20</Page>
    <Inventor>asdq</Inventor>
    <Country>Russia</Country>
    <Number>29</Number>
    <Date>2014-03-21T00:00:00+04:00</Date>
    <DateIssue>2014-03-21T09:24:51.4565416+04:00</DateIssue>
    <PS>dsada</PS>
  </CatalogItem>
</Catalog>



1. Как можно заменить
Код: xml
1.
<CatalogItem xsi:type="Pattent">


на
Код: xml
1.
<Pattent>


2. Как в XSD схему
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="CatalogSchema"
    targetNamespace="https://Kashin/CatalogSchema.xsd"
    elementFormDefault="qualified"
    xmlns="https://Kashin/CatalogSchema.xsd"
    xmlns:mstns="https://Kashin/CatalogSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
  
  <xs:element name="Catalog">    
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="CatalogItem">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Title" type="xs:string"></xs:element>
              <xs:element name="Author" type="xs:string"></xs:element>
              <xs:element name="City" type="xs:string"></xs:element>
              <xs:element name="Issue" type="xs:string"></xs:element>
              <xs:element name="DateIssue" type="xs:date"></xs:element>
              <xs:element name="Page" type="xs:int"></xs:element>
              <xs:element name="PS" type="xs:string"></xs:element>
              <xs:element name="ISBN">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="[7-9]{3}-[0-9]-[0-9]{2}-[0-9]{6}-[0-9]"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:sequence>           
          </xs:complexType>
        </xs:element>
....


за место
Код: xml
1.
<xs:element name="CatalogItem">

добавить
Код: xml
1.
<xs:element name="CatalogItem" xsi:type="Book">

.
...
Рейтинг: 0 / 0
21.03.2014, 20:23
    #38593308
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML сериализация
wizzzi1. Как можно заменить
Код: xml
1.
<CatalogItem xsi:type="Pattent">


на
Код: xml
1.
<Pattent>


По-моему, это невозможно.
xsi:type как раз и предназначено для того, чтобы указывать точный тип наследника, а имя элемента - тип родителя.

wizzzi2. Как в XSD схему
...
за место
Код: xml
1.
<xs:element name="CatalogItem">

добавить
Код: xml
1.
<xs:element name="CatalogItem" xsi:type="Book">


Вот здесь пишут, что это не нужно. Да, валидатор выдаёт варнинг, но это неважно.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / XML сериализация / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]