2012-03-28 3 views
0

У меня есть XSD:XML с коллекциями и XmlSerializer

<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 и примером в начале этого сообщения?

ответ

1

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

Proper way to implement IXmlSerializable?

1

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