web-dev-qa-db-ja.com

XPathを使用してXMLのコメントにアクセスする

XPathを使用してXMLドキュメント内のコメントにアクセスする方法

例えば:

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

「コメントはこちら」にアクセスしたい。

ありがとう...

編集:私はMSXML DOM ActiveXを使用していますが、コマンドcomment()が失敗しているようです...なぜだと思いますか?

45
Manoj

パスで

/foo/bar/comment()

/ foo/bar要素のすべてのコメントを選択できます。もちろん、選択した言語によって異なります。しかし、一般的にはこれがあなたのやり方です。

57
Björn

たとえば、comment()関数を使用します。

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

長さ要素に続く最初のコメントを選択します。

編集

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

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

これで、完全なXPath言語がクエリで機能します(1つの重大な変更は、インデクサー述部がXPathに基づく1であるのに対し、XSLパターンでは0であったことに注意してください)。

19
AnthonyWJones

投稿された回答に対するOPのコメント(およびこの単純なことが機能しない理由についての私の好奇心)に基づいて、以下が私の提案です。

@ 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"

注:

a。 MSXMLのバージョンは異なる場合があります。適宜ご利用ください。

b。この種類のコードはIEでのみ機能するため、お勧めできません。ただし、これは明示的に述べられた要件であるため、ActiveXObjectを使用しました。

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

3
Cerebrus

多分これは助けになるかもしれません、このサンプルはコメントを削除します

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

ここから寄りかかった リンクテキスト

1
adopilot