如何使用XPath访问XML文档中的注释?
例如:
<table>
<length> 12 </length>
<!--Some comment here-->
</table>
我想访问“这里的一些评论”。
...谢谢
编辑:我正在使用MSXML DOM ActiveX,命令注释()似乎失败了...任何想法为什么?答案 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
,您需要查询其data
或text
属性。
答案 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.