使用具有未知根元素的XmlSerializer

问题描述

我有一些看起来像这样的XML文件

文件“ B156.xml”

<B156>
  <Customer>
    <Name>The Barn</Name>
    <Phone>0427825166</Phone>
  </Customer>
  <Orders>
    <Item>
      <Description>Black toner</Description>
      <Amount>$59.00</Amount>
    </Item>
  <Orders>
</B156>

文件“ B172.xml”

<B172>
  <Customer>
    <Name>Pixie Inc</Name>
    <Phone>0426553190</Phone>
  </Customer>
  <Orders>
    <Item>
      <Description>Colour toner</Description>
      <Amount>$79.00</Amount>
    </Item>
  <Orders>
</B172>

在这种情况下,考虑到根元素是动态的,并且不能使用XmlRoot(“ RootName”)来指定它,如何使用XmlSerializer?

解决方法

您可以尝试一下

CLASS OBJECT

[XmlRoot("root")]
public class CustomerOrder
{
    public Customer Customer { get; set; }

    [XmlArray("Orders")]
    [XmlArrayItem("Item")]
    public List<Order> Orders { get; set; }
}

public class Customer
{
    public string Name { get; set; }
    public string Phone { get; set; }
}

public class Order
{
    public string Description { get; set; }
    public string Amount { get; set; }
}

CHANGEROOT方法

    private static XmlDocument changeRoot(XmlDocument xmlDocument)
    {
        var newXmlDocument = new XmlDocument();
        var newRoot = newXmlDocument.CreateElement("root");
        newXmlDocument.AppendChild(newRoot);
        newRoot.InnerXml = xmlDocument.DocumentElement.InnerXml;

        return newXmlDocument;
    }

SERIALIZATION

        var xmlDocument = new XmlDocument();
        xmlDocument.Load("XMLFile1.xml");
        xmlDocument = changeRoot(xmlDocument);

        XmlSerializer serializer = new XmlSerializer(typeof(CustomerOrder));
        CustomerOrder result;

        using (TextReader reader = new StringReader(xmlDocument.InnerXml))
        {
            result = (CustomerOrder)serializer.Deserialize(reader);
        }