【问题标题】:using XmlSerializer with unknown root element使用带有未知根元素的 XmlSerializer
【发布时间】:2020-08-28 04:26:39
【问题描述】:

我有一些如下所示的 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>

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

【问题讨论】:

  • 不能使用 LINQ to XML 吗?
  • @silkfire 我使用 XmlSerializer 因为有很多属性需要序列化到域类中,为了简洁起见,上面的示例被简化了。
  • 考虑到您的示例,您不能从文件名本身获取根元素名称吗?
  • @GurhanPolat 我没有兴趣在这里获取根元素。我的问题是,如果我没有指定有效的根,XmlSerializer 会抛出错误,在我的情况下我不能,因为它们是动态的。 (B156、B172 等)

标签: c# xmlserializer


【解决方案1】:

你可以试试这个,

类对象

[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; }
}

换根方法

    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;
    }

序列化

        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);
        }

【讨论】:

  • 这行得通!抱歉,我之前忘记接受这个答案了。
猜你喜欢
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2012-02-02
  • 1970-01-01
相关资源
最近更新 更多