2012-10-17 52 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); 
}