具有集合和XmlSerializer的XML
本文关键字:XML XmlSerializer 集合 | 更新日期: 2023-09-27 18:29:09
我有一个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>
我有一个使用以下XSD构建的XML:
<?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>
现在我想使用XmlSerializer来序列化/反序列化这个XML。我有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和本文开头的示例对它们进行序列化?
根据您的标准,我将在rootType
上实现IXmlSerializable
。关于如何创建您想要的XML,这里有一篇关于SO的精彩文章。
实现IXmlSerializable的正确方法?
我发现,找出如何设计类以匹配特定模式的最快方法是向后运行xsd.exe
工具。告诉它从你的模式中生成类,并将它们与你手工编写的类进行比较,看看哪里出了问题。这是一个很好的方式来获得串行器如何工作的经验。