2009-08-07 8 views
8

私はルート要素、2つの子要素、 '診断'と '結果'を持つXML文書を持っています。 'results'要素には 'result'という名前の任意の数の要素がありますC#XmlDocument SelectNodes

これをXmlDocumentに読み込むと、構造体をナビゲートして操作が簡単になります。私はすべての "結果"要素を抽出する再帰関数を書くことができます。 XmlDocument.SelectNodes( "// results")はノードに問題はないと判断します。

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

私は同僚と話をしており、彼はXmlDocument.SelectNodesでXpathを使って悲しんでいました。誰かがこの種の問題にぶつかる?どんな解決策ですか?

XMLファイル:

<?xml version="1.0" encoding="UTF-8"?> 
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="10" yahoo:created="2009-08-07T10:19:59Z" yahoo:lang="en-US" yahoo:updated="2009-08-07T10:19:59Z" yahoo:uri="http://query.yahooapis.com/v1/yql?q=select+*+from+search.news+where+query%3D%22Tanzania%22"> 
    <diagnostics> 
     <publiclyCallable>true</publiclyCallable> 
     <url execution-time="47"><![CDATA[http://boss.yahooapis.com/ysearch/news/v1/Tanzania?format=xml&start=0&count=10]]></url> 
     <user-time>49</user-time> 
     <service-time>47</service-time> 
     <build-version>2579</build-version> 
    </diagnostics> 
    <results> 
     <result xmlns="http://www.inktomi.com/"> 
      <abstract>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.</abstract> 
      <clickurl>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</clickurl> 
      <date>2009/08/07</date> 
      <language>english</language> 
      <source>The Monitor</source> 
      <sourceurl>http://www.monitor.co.ug/</sourceurl> 
      <time>20:22:32</time> 
      <title>SC Villa face Simba in Tanzania</title> 
      <url>http://www.monitor.co.ug/artman/publish/sports/SC_Villa_face_Simba_in_Tanzania_89289.shtml</url> 
     </result> 

XPATH

doc.SelectNodes( "//結果は")は、ヒットを生成しません。

+0

xmlのサンプルがありますか?あなたの "result"要素が実際に "results"要素とは異なる名前空間に存在する可能性はありますか?要素に適格な接頭辞はありますか? –

答えて

18

ロブ(xが与えられた名前空間のエイリアスとしてnsmgrに定義されている場合)とマークの答えはおそらく正しい方向に向いています.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 result in results) 
{ 
    ... 
} 

基本的にXMLにLINQは、(私はそれが欠けているいくつかの機能があると信じて:)私の経験では、ほとんどあらゆる方法で優れたAPIですが、あなたがアクセス権を持っている場合:それはそれは本当に簡単になるだろう.NET 3.5それは間違いなく少なくとも試してみる価値があります。)

+0

ジョンさん、ありがとう、私はLINQに切り替えました。 :) – Daniel

+0

これは私のためにそれをしましたが、それは私の問題だったXNamespaceの部分でした。 Jon Skeetにポイントを与えるのは嫌だけど... ...長いテールとすべて。 –

+3

@ジョン:もしそれがどんな慰めであっても、アップヴォートは私にそれ以上の代理人を与えてくれませんでした。私は約9時間前に代理店に達しました。 –

12

名前空間が問題のように私に聞こえます。あなたは一般的に、このためXmlNamespaceManagerの助けを求めると、クエリ内の別名を使用する必要がある。すなわち

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

+0

ありがとう、それはまさにそれでした。 – Daniel

関連する問題