2009-04-24 14 views
39

XPathを使用してXML文書内のコメントにアクセスする方法は?例えばXPathを使用したXMLのコメントへのアクセス

<table> 
<length> 12 </length> 
<!--Some comment here--> 
</table> 

は、私が "ここにいくつかのコメント" にアクセスしたいです。

おかげで...

編集:私はMSXML DOM ActiveXとコマンドコメント()失敗しているようだ...任意のアイデア理由を使用していますか?あなたが/ fooの/バー要素にすべてのコメントを選択することができますパス

/foo/bar/comment() 

答えて

50

。もちろん、あなたの言語にもよります。しかし、一般的にこれはあなたがそれを行う方法です。例えば

+0

私はMSXML DOM ActiveXを使用していますが、このコマンドは失敗しているようです...なぜか? – Manoj

+0

いいえ、なぜ私は考えていません。最後にMSXMLライブラリを使用してから7年以上が経過しました。 –

+0

確かに、あなたのXPathルートは大丈夫ですか? "// comment()"を試してください。 – annakata

19

使用コメント()関数: -

/table/length/following::comment()[1] 

は、長さ要素を次の最初のコメントを選択します。

編集

これはMSXMLに機能しない理由Manojさんは、この回答へのコメントで尋ねます。その理由はMSXML3を使用しているためです。既定では、MSXML3は選択言語としてXPathを使用しませんが、初期のはるかに弱い言語(XSLパターン)にデフォルト設定されています。 DOMDocumentのsetPropertyメソッドを使用して、選択言語としてXPathを設定する必要があります。例えば(JScriptで): -

var dom = new ActiveXObject("MSXML2.DOMDocument.3.0"); 
dom.setProperty("SelectionLanguage", "XPath"); 

今すぐフルXPath言語があなたのクエリで動作しますが(彼らはXSLパターンに基づいて、0だったのに対し、1つの破断の変化に注意しているインデクサ述語が1のXPathに基づいています)。

+1

または単に:/ table/comment()[1] – Tomalak

+0

この特定のケースではおそらくすべての種類のアプローチがありますが、これは私がより一般的な解答特定の要素。 – AnthonyWJones

+1

私はMSXML DOM ActiveXを使用していますが、このコマンドは失敗しているようです...なぜか? – Manoj

1

多分これが役立つcoud、 このサンプルでは、​​ここに掲載の回答にOPのコメント(およびこの単純な事が働かない理由として、私の好奇心に基づいてlink text

+0

ルートにコメントがあるとエラーになるので、node.ParentNodeがnullでないことを確認するとよいでしょう。 –

3

から身を乗り出しコメント

XmlNodeList list = xmlDoc.SelectNodes("//comment()"); 
foreach(XmlNode node in list) 
node.ParentNode.RemoveChild(node); 

を削除します)、ここに私の提案があります:

@Anthonyで提案されたXPath式を使用して、次のJS関数を使用してコメントノードを正常に読み込むことができました:

function SelectComment(s) 
{ 
    var xDoc = new ActiveXObject("MSXML2.DOMDocument.6.0"); 
    if (xDoc) 
    { 
    xDoc.loadXML(s); 
    var selNode = xDoc.selectSingleNode("/table/length/following::comment()[1]"); 
    if (selNode != null) 
     return selNode.text; 
    else 
     return ""; 
    } 
} 

サンプル呼び出し:

SelectComment("<table><length> 12</length><!--Some comment here--></table>"); 

出力:

"Some comment here" 

注:

。 MSXMLのバージョンは異なる場合があります。適切に使用してください。

b。この種のコードは、IE上でのみ動作するため、間違いなく推奨されています。しかし、これは明記された要件であるため、私はActiveXObjectを使用しました。

c。あなたのコメントには、提案されたXPath式で何が失敗したかは言及していません。私の推測では、取得したノードのtextプロパティを照会していないということです。 SelectSingleNodeは常にIXmlNodeを返し、そのdataまたはtextプロパティを照会する必要があることに注意してください。

関連する問題