2009-07-28 7 views
3

を照会する方法を私は次のような構造を持つXML-ファイルを、持っている:C#とXPathは

_xmlArticlesDocument = new XmlDocument(); 
_xmlArticlesDocument.Load(xmlArticlesFileName); 
:私は、次のコードをXPathにクエリについて少し赤と書いた
<mediawiki ...> 
    <siteinfo>...</siteinfo> 
    <page> 
    <title>The Title</title> 
    <id>42</id> 
    ... 
    </page> 
    ... more page items ... 
</mediawiki> 

今、id要素を指定してページ要素を把握したいと考えています。だから私は書いた:

XmlNode node = _xmlArticlesDocument.DocumentElement.SelectSingleNode 
       ("//mediawiki/page[id=" + id.ToString() + "]"); 

しかし、ノードは常にnullです。私は何かを得るために "page/id"、 "page"、 "/ page"、 "// page"を含むいくつかのquerysを試しましたが、ノードは常にnullです。クイックインスペクションで_xmlArticlesDocument変数をチェックし、予想される構造を持つ正しいXMLファイルが含まれています。

私は非常に基本的なものを見逃してしまったようですが、何も分かりません。多分誰かがここにアイデアを持っていますか?事前に

おかげで、 フランク

答えて

5

あなたがこれまで示した内容に基づいてクエリが正しく表示されます。しかし、私は "..."と思われるmediawiki要素にはxmlns = "...."属性がありますか?

これは、私が疑っているあなたを引き上げているものでしょう。次のようなコードが必要です。 -

XmlNamespaceManager nsmgr = new XmlNamespaceManager(_xmlArticlesDocument.NameTable); 
nsmgr.AddNamespace("a", "the-namespace-in-them-xmlns-attribute"); 
XmlNode page = _xmlArticlesDocument.SelectSingleNode(String.Format("//a:page[id={0}]", id), nsmgr); 
+0

これは前進の方法ですが、私はそれに悩まされていましたが、一度これで把握すると簡単です。 :) –

+0

頭に釘を打つ!問題は欠けていたネームスペースマネージャーでした。それはチュートリアルでは私が赤では言及していませんでした。しかし、id-Elementが名前空間にもあるため、クエリの少しの変更が必要です。 "a:page [a:id =" + id.toString()+ "]"どうもありがとう! – Aaginor

3

あなたが試してみました:

_xmlArticlesDocument.DocumentElement.SelectSingleNode 
       ("page[id='" + id.ToString() + "']"); // Note the single quotes 

をまた、XMLノードのいずれかがデフォルトの1(すなわち<mediawiki xmlns="whatever">)でない名前空間にある場合、あなたは、また、XmlNamespaceManagerが必要になります。

+0

//は、クエリをドキュメントの先頭に移動する必要があります。 – AnthonyWJones

+0

私は//を使用することを示唆していませんでしたか...あなたのポイントを理解していませんか? –

+0

'id'に一重引用符が含まれていないことを確認してください。そうしないと、無効なXPathが原因で' SelectSingleNode() 'が失敗します。 – Tomalak

2

Linq to XMLをチェックしてください。私はXML noobでもあり、XMLDocumentの方が簡単であることがわかりました。

+0

私はちょうどそれをまた提案するつもりでした。 XPathを理解しておらず、C#.NetでXMLを解析する必要がある場合は、LinqからXMLへの道のりです。 – Kon

+0

私はあなたのベルトの下にXPathをまだ持っていないなら、スキルがより譲渡できるので、LINQのアプローチがよりよくなるかもしれないことに同意します。 – AnthonyWJones

+0

ああ、私はこれらが問題を引き起こしていると思います。一緒にビットを取得した後、それは私に非常に直感的に見えます。 StackOverflowのこの素晴らしいコミュニティでは、問題を起こしている人たちが長い間解決されることはありません;) – Aaginor