c#从不同节点反序列化xml

时间:2014-09-23 08:32:31

标签: c# .net xml windows-runtime deserialization

我有一个xml文件,例如:

<?xml version="1.0" encoding="UTF-8"?>
<Adresses>
  <Message>
    <Header>
      <MessageID>96</MessageID>
      <Timestamp>22.08.2014 10:25:01</Timestamp>
    </Header>
    <Body>
      <Person SurName="Muster" Prename="Max">
        <Adress Street="Street 1"/>
      </Person>
            <Person SurName="Muster" Prename="Max">
        <Adress Street="Street 1"/>
      </Person>
      <Person SurName="Muster" Prename="Max">
        <Adress Street="Street 1"/>
      </Person>
    </Body>
  </Message>
</Adresses>

从这个xml我只想要body标签内的部分。我使用XmlSerializer和annotaions进行反序列化。所以我的模型看起来像这样

[XmlRoot("Body")]
    public class BodyXml
    {
        public BodyXml()
        {}

        [XmlElement("Person")]
        public Person[] Persons { get; set; }
    }

现在我的问题是如何让XmlSerializer从body-tag序列化而不是从adresses-tag序列化?我的模型中是否需要另外注释?

谢谢和问候

2 个答案:

答案 0 :(得分:1)

根据其他约束,要么考虑编写一个快速且脏的包装器来反序列化整个XML(使用BodyXml作为其成员),或者只选择xml的相关部分,例如:

var serializer = new XmlSerializer(typeof(BodyXml));
var xDoc = XDocument.Parse(YOUR_XML_STRING);
using (var xmlReader = xDoc.Descendants("Body").Single().CreateReader())
{
   var result = serializer.Deserialize(xmlReader);
}

编辑:没有任何背景我会选择后者。

答案 1 :(得分:0)

使用XmlIgnoreAttribute

您可以添加地址属性,如下所示

[XmlIgnoreAttribute]
public AddressClass Adress{get;set;}

这里AddressClass可以输入你的Address属性或其他类。