2014-03-03 73 views
0

的一部分,我有這樣的的LINQ to XML後人無法讀取XML

<document> 
    <indexroot> 
     <type>type</type> 
     <model>model</model> 
    </indexroot> 
    <root> 
     <model_type1>model type 1</model_type1> 
     <model_type2>model type 2</model_type2> 
    </root> 
</document> 

XML文檔和的LINQ to XML代碼:

var elements = (from element in pdb.Descendants() 
       select new 
       { 
        type = (string)element.Element("type") ?? "-", 
        model= (string)element.Element("model") ?? "-", 
        model_type1= (string)element.Element("model_type1") ?? "-", 
        model_type2= (string)element.Element("model_type2") ?? "-" 
       }).FirstOrDefault(); 

我得到類型和模型變量,但它似乎我無法達到model_type1和model_type2,現在我明白,這是因爲indexroot和根標記,amd,如果我將這些標記分離爲具有後代(「indexroot」)和後代(「根」)的xml代碼塊, ,一切正常,但我不能在一個街區,是否有可能做到這一點,以及如何?

回答

0

您需要爲每個要提取的元素導航XML heirarchy。

這是因爲Element方法只查看直接的子節點,而不是節點的所有後代。從the documentation

獲取具有指定XName的第一個(按文檔順序)的子元素。

一個實現只使用LINQ到XML可能是:

xml = "<document>" + 
    "<indexroot>" + 
    " <type>type</type>" + 
    " <model>model</model>" + 
    "</indexroot>" + 
    "<root>" + 
    " <model_type1>model type 1</model_type1>" + 
    " <model_type2>model type 2</model_type2>" + 
    "</root>" + 
    "</document>"; 

    XDocument doc = XDocument.Parse(xml); 

    var newItem = (from element in doc.Descendants("document") 
       select new 
    { 
     Type = (string)element.Element("indexroot").Element("type") ?? "-", 
     Model = (string)element.Element("indexroot").Element("model") ?? "-", 
     ModelType1 = (string)element.Element("root").Element("model_type1") ?? "-", 
     ModelType2 = (string)element.Element("root").Element("model_type2") ?? "-", 
    }).FirstOrDefault(); 

    Console.WriteLine(newItem); 
+0

謝謝!它的工作原理,只是一個問題,如果我可以,是否有辦法實現,但使用「XElement」而不是「XDocument」? –

+0

這段代碼和XElement的XDocument一模一樣:) –

+0

我知道它是如何工作的,當我使用XDocument條件Type =(string)element.Element(「indexroot」)。Element(「type 「)?? 「 - 」工作正常,如果說有時元素「類型」不存在於xml文檔中,並且當XElement發生這種情況時會拋出錯誤。 –