使用XPath访问XML中的注释

时间:2009-04-24 06:31:02

标签: xpath

如何使用XPath访问XML文档中的注释?

例如:

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

我想访问“这里的一些评论”。

...谢谢

编辑:我正在使用MSXML DOM ActiveX,命令注释()似乎失败了...任何想法为什么?

5 个答案:

答案 0 :(得分:56)

使用路径

/foo/bar/comment()

您可以选择/ foo / bar元素中的所有注释。当然,可能取决于您选择的语言。但通常这就是你如何做到的。

答案 1 :(得分:19)

使用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语言将在您的查询中起作用(请注意,一个重大变化是索引器谓词在XPath中为1,而在XSL模式中为0)。

答案 2 :(得分:3)

根据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"

备注:

一个。您的MSXML版本可能会有所不同。请妥善使用。

湾绝对不推荐这种代码,因为它只适用于IE。但是,由于这是您明确声明的要求,我使用了ActiveXObject。

℃。您没有在评论中提到在建议的XPath表达式中失败的内容。我的猜测是你没有查询检索到的节点的text属性。请注意,SelectSingleNode始终返回IXmlNode,您需要查询其datatext属性。

答案 3 :(得分:1)

也许这会有所帮助, 此示例删除了评论

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

从这里了解link text

答案 4 :(得分:-2)

<adjustment>
<!-- krishna k -->
<name>FX Update USD</name>
<!-- Since this plan updates existing adj's no ajd's will be created using this id -->
<id>7206</id>
Am facing the similar Issue my application is reading comments which causes stack crash. How can I avoid reading comments by DOM.