2010-12-16 25 views
1

用:解析XDocument私はこのようなXMLファイルを解析しようとした属性

<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なぜあなたは '

答えて

1

123456789は、実際の要素ではなく、属性の値です。

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

string isbn = (string)attr; 

は、あなたもそれ一行作ることができますが、あなたがXMLにLINQに新しいしている場合、これは読みやすくかもしれない:何がしたいので同様に行うことができます。

2

XPathSelectElement()拡張メソッドを使用してみることができます[取得するにはSystem.Xml.XPathを使用する必要があります]。

など。

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

+0

私もそうです... XPathは、深いクエリを無限に読みやすくしますが、メンテナンスする開発者が(特に複雑なものを扱う場合は)把握するための別の構文も表します。この例では、それははるかにクリーンで、私の意見では分かりやすいほどです! – Reddog

0

私は個々の答えにどのように反応するかを理解することはできません.....しかし、私はそれらを実装し、両方とも動作します。

私は少し簡単でLINQの新機能であるため、Reddogの答えについていくつもりですが、これは読みやすさのために今のところ最も簡単です。

ありがとうございました!

関連する問題