2017-02-28 40 views
0

假設我有以下XML格式。使用選擇內的選擇

<data> 
    <appName>Microsoft Word</appName> 
    <appId>123</appId> 
</data> 

在XML中有多個數據樹的地方,我有以下代碼來構建數據對象列表。

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
     } 
    ).ToList(); 

不過,我遇到了問題,如果我增加一個額外的樹中的數據標籤下,像這樣:

<data> 
    <appName>Microsoft Word</appName> 
    <appId>123</appId> 
    <appOptions> 
      <Win7Compat>true</Win7Compat> 
      <Win7x64Compat>false</Win7x64Compat> 
    </appOptions> 
</data> 

我使用下面的代碼:

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
      appOptions = 
      (
       from appNode in dataNode.Elements("appOptions") 
       select new AppOptionsObj 
       { 
        win7Compat = appNode.Element("Win7Compat"), 
        win7x64Compat = appNode.Element("Win7x64Compat") 
       } 
      ) as AppOptionsObj, 
     } 
    ).ToList(); 

我的appOptions對象始終被視爲null。我有一種感覺,我沒有正確解析子樹。

+0

它不應該是'從appNode在dataNode.Element(「appOptions」)'(單)?另外,您發佈的內容不是有效的XML。 'Win7Compat'和下一個兄弟沒有關閉。 –

+0

我不相信這是你運行的代碼 - 這裏有明確的語法錯誤和拼寫錯誤。如果您需要幫助,您必須向我們展示您正在使用的代碼。發佈的代碼只會給出一堆錯誤。 – Hogan

+0

你爲什麼不簡單地將這個XML反序列化爲一個對象? –

回答

2

的問題是,你與as AppOptionsObj但你Select鑄造真的返回在null一個IEnumerable<AppOptionsObj>所以投的結果。你可能想使用SingleOrDefault()返回單一實例,而不是:

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
      appOptions = 
      (
       from appNode in dataNode.Elements("appOptions") 
       select new AppOptionsObj 
       { 
        win7Compat = appNode.Element("Win7Compat"), 
        win7x64Compat = appNode.Element("Win7x64Compat") 
       } 
      ).SingleOrDefault(), 
     } 
    ).ToList(); 
+0

工作完美!非常感謝。 – LeoVannini