XML с коллекциями и XmlSerializer - PullRequest
0 голосов
/ 28 марта 2012

У меня есть XSD:

<xs:complexType name="rootType">    
  <xs:sequence>
    <xs:element name="foo" type="fooType" minOccurs="1" maxOccurs="unbounded"/>
    <xs:element name="bar" type="barType" minOccurs="1" maxOccurs="unbounded"/>
  </xs:sequence>    
</xs:complexType>
<!-- SKIPPED -->
<xs:element name="root" type="rootType"></xs:element>

У меня есть XML, созданный с использованием этого XSD:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <foo><!-- SKIPPED --></foo>
  <foo><!-- SKIPPED --></foo>
  <foo><!-- SKIPPED --></foo>
  <bar><!-- SKIPPED --></bar>
  <bar><!-- SKIPPED --></bar>
  <bar><!-- SKIPPED --></bar>
  <bar><!-- SKIPPED --></bar>
</root>

Теперь я хочу сериализовать / десериализовать этот XML с помощью XmlSerializer.У меня есть классы C #:

public class fooType
{
    public string element { get; set; }
}

public class barType
{
    public string element { get; set; }
}

public class rootType
{
    public fooType[] foos { get; set; }
    public barType[] bars { get; set; }
}

Были некоторые атрибуты, связанные с XML, такие как XmlElementAttribute, но я опускаю их в примере выше для простоты.

Теперь, пожалуйста, посмотрите на rootTypeопределение класса.Здесь у нас есть два свойства foos и bars.Они будут сериализованы как корневые элементы для массивов fooType[] и barType[]:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <foos>
    <foo><!-- SKIPPED --></foo>
    <foo><!-- SKIPPED --></foo>
    <foo><!-- SKIPPED --></foo>
  </foos>
  <bars>
    <bar><!-- SKIPPED --></bar>
    <bar><!-- SKIPPED --></bar>
    <bar><!-- SKIPPED --></bar>
    <bar><!-- SKIPPED --></bar>
  </bars>
</root>

Но это не то, что я хочу.Как их сериализовать в соответствии с XSD и примером в начале этого поста?

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Я считаю, что самый быстрый способ выяснить, как спроектировать ваши классы в соответствии с конкретной схемой, - запустить инструмент xsd.exe в обратном направлении. Скажите ему, чтобы генерировать классы из вашей схемы, и сравнивать их с вашими рукописными классами, чтобы увидеть, где вы ошиблись. Это отличный способ получить опыт работы сериализатора.

1 голос
/ 28 марта 2012

Исходя из ваших критериев, я бы реализовал IXmlSerializable на rootType. Здесь вы можете прочитать о том, как создать XML, который вы ищете.

Правильный способ реализации IXmlSerializable?

...