具有集合和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类的定义。这里我们有两个属性foosbars。它们将像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和本文开头的示例对它们进行序列化?

具有集合和XmlSerializer的XML

根据您的标准,我将在rootType上实现IXmlSerializable。关于如何创建您想要的XML,这里有一篇关于SO的精彩文章。

实现IXmlSerializable的正确方法?

我发现,找出如何设计类以匹配特定模式的最快方法是向后运行xsd.exe工具。告诉它从你的模式中生成类,并将它们与你手工编写的类进行比较,看看哪里出了问题。这是一个很好的方式来获得串行器如何工作的经验。