2012-10-17 40 views
0

我试图反序列化的XML文档,其中一个节点可以这样表示:反序列化:几种节点到同一个对象

<n1 zone="00000" id="0000" /> 

或本:

<n2 zone="00000" id="0000" /> 

或本:

<n3 zone="00000" id="0000" /> 

在我的文档,我将永远有一个“N1”节点或一个“N2”节点或一个“N3”节点。我想将所有这些片段反序列化为此类的一个实例:

[Serializable] 
public class N 
{ 
    [XmlAttribute("zone")] 
    public string Zone { get; set; } 

    [XmlAttribute("id")] 
    public string Id { get; set; } 
} 

但我没有设法做到这一点。文档建议使用XmlChoiceIdentifier属性来实现这一点,但也许我以错误的方式使用它。

有什么想法? PS:我知道我可以创建三个类:N1,N2和N3,并将它们映射到我的不同类型的XML片段。但我更喜欢更清洁的解决方案。

+1

继承即将在脑海中。每个N *类继承自N – KyorCode

+0

还想到了XPath:http://www.w3schools.com/xpath/xpath_syntax.asp – KyorCode

+0

KyorCode:恰恰是我搜索要避免的解决方案:)但如果我找不到另一种方式我会使用继承。 – schglurps

回答

0

LINQ到XML

XDocument x = XDocument.Parse(
      "<root><n1 zone=\"0000\" id=\"0000\"/><n2 zone=\"0001\" id=\"0011\"/><n3 zone=\"0002\" id=\"0022\"/></root>"); 

var result = from c in x.Element("root").Descendants() 
      select new N { Zone = c.Attribute("zone").Value, 
          Id = c.Attribute("id").Value }; 

它不使用串行,我认为你是瞄准你可以使用,但它前进的道路。

1

假设你有这样的:

<?xml version="1.0"?> 
<ns> 
    <n1 id="0000" zone="00000"/> 
    <n2 id="0000" zone="00000"/> 
    <n3 id="0000" zone="00000"/> 
</ns> 

你可以使用LINQ 到XML

XDocument document = XDocument.Load(path); 
XElement parentNode = document.Element("ns"); 
var childNodes = parentNode.Elements().Where(x => x.Name.ToString().StartsWith("n")); //this prevent from take elements wich didn't start with n 

List<N> list = new List<N>(); 
foreach (XElement element in childNodes) { 
    N n = new N(){ 
     Id = element.Attribute("id").Value, 
     Zone = element.Attribute("zone").Value 
    }; 

    list.Add(n); 
}