8


1

C#XmlDocumentのSelectNodes

ルート要素、2つの子要素、 'diagnostic’と 'results’を含むxml文書があります。 'results’要素は 'result’という名前の任意の数の要素を持つ

これをXmlDocumentにロードすると、構造をナビゲートするのが簡単になり、これがまさに動作の仕方なのです。 すべての「結果」要素を取り出す再帰関数を書くことができます。 XmlDocument.SelectNodes( "// results")は問題のないノードを見つけます。

ただし、* XmlDocument.SelectNodes( "// results / result")は何も見つけません。
* XmlDocument.SelectNodes( "// result")は何も見つけません。

私は同僚と話をしましたが、彼はXmlDocument.SelectNodesのXpathを使って悲しんでいました。 このような問題に遭遇する人はいますか。 解決策はありますか?

XMLファイル

        true
        http://boss.yahooapis.com/ysearch/news/v1/Tanzania?format=xml&start=0&count=10
        49
        47
        2579



            Kakungulu Cup winners SC Villa face Tanzania’s Simba SC this afternoon at the National stadium in Dar es salaam. “We had a very tiresome journey. The road was so bad and the road blocks were so many. However, we finally reached but the boys were so tired,” said Kato.
            http://lrd.yahooapis.com/_ylc=X3oDMTQ4cXAxcnRoBF9TAzIwMjMxNTI3MDIEYXBwaWQDb0pfTWdwbklrWW5CMWhTZnFUZEd5TkouTXNxZlNMQmkEY2xpZW50A2Jvc3MEc2VydmljZQNCT1NTBHNsawN0aXRsZQRzcmNwdmlkA21VVGlta2dlQXUzeEYuM0xGQkQzR1pUU1FIS0dORXA4cUk4QUJJX1U-/SIG=12vhpskdd/**http%3A//www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml
            2009/08/07
            english
            The Monitor
            http://www.monitor.co.ug/
            20:22:32
            SC Villa face Simba in Tanzania
            http://www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml

XPATH

doc.SelectNodes( "// result")はヒットしません。

2 Answer


18


RobとMarcの答えはおそらく正しい方向に向かっています - XmlDocument名前空間XPathはちょっとした痛みになる可能性があります。

NET 3.5を使用できる場合は、代わりにLINQ to XMLを使用することをお勧めします。 それは本当に簡単になります。
XDocument doc = XDocument.Load( "foo.xml"); XNamespace ns = "bar"; var results = doc.Descendants(ns "result");

foreach(varが結果になる){... }

基本的にLINQ to XMLは、私の経験ではほとんどすべての点で優れたAPIです。


12


名前空間が問題であるように思えます。通常、このために `+ XmlNamespaceManager +`の助けを借りて、クエリでエイリアスを使用する必要があります。

doc.SelectNodes("//x:results/x:result", nsmgr);

(ここで、「+ x 」は「 nsmgr +」で指定されたネームスペースのエイリアスとして定義されます)