2010-12-16 118 views
1

我試圖解析這樣的XML文件:解析的XDocument

<books> 
    <book> 
     <attr name="Moby Dick">Moby Dick is a classic</attr> 
     <attr isbn="isbnNumber">123456789</attr> 
    </book> 
</books> 

我怎樣才能獲得的「123456789」的價值?我並不需要第一個屬性。

我試着在foreach循環中讀取這些獲取XElements,但我不斷收到NULL對象異常。

foreach(XElement xe in XDoc.Attribute("attr")) 
{ 
    string str = xe.Attribute("isbnNumber").Value // NULL EXCEPTION HERE 
} 

在此先感謝...

+0

一個奇怪的XML ...你爲什麼要使這些屬性'書'而不是' 2010-12-16 01:45:34

回答

1

123456789實際上是一個元素的值,而不是屬性。你想要什麼可以做,像這樣:

XElement attr = xDoc.Descendants("attr") 
        .FirstOrDefault(x=> 
         (string)x.Attribute("isbn") == "isbnNumber" 
        ); 

string isbn = (string)attr; 

你甚至可以使一個線,但如果你是新來的LINQ to XML,這可能是更容易閱讀。

2

你可以嘗試使用XPathSelectElement()擴展方法[你需要使用System.Xml.XPath來獲取它們]。

E.g.

var isbn = xDoc.XPathSelectElement("//book/attr[@isbn='isbnNumber']").Value 

PS。一個很好的XPath測試器是:http://www.yetanotherchris.me/home/2010/6/7/online-xpath-tester.html

+0

我個人認爲XPath可能是更好的解決方案。我從來沒有對LINQ to XML方式留下過深刻的印象。 – Josh 2010-12-16 01:47:56

+0

我也是這樣...... XPath使深層查詢具有無限可讀性,但它們也代表了維護開發人員掌握的另一種語法(特別是在執行復雜事務時)。雖然在這個例子中,它更清晰,並且在我看來很容易理解! – Reddog 2010-12-16 01:55:04

0

嗯,我無法弄清楚如何響應個人答案.....但我實現了他們兩個,他們都工作。

我正在與Reddog的答案,因爲它是一個更直接一點,是新的LINQ這是目前最容易閱讀的可讀性。

感謝您的回覆!