2009-04-24 62 views
39

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

例如:

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

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

谢谢...

编辑:我使用MSXML DOM ActiveX和命令评论()似乎是失败......任何想法,为什么?

回答

50

随着路径

/foo/bar/comment() 

您可以选择在/富/酒吧元素的所有意见。当然,可能取决于你选择的语言。但通常这是你如何做到的。例如

+0

我正在使用MSXML DOM ActiveX,并且此命令似乎失败了......任何想法为什么? – Manoj 2009-04-24 07:11:02

+0

不,我不知道为什么。从上次使用MSXML库开始已经过去7年了... – 2009-04-24 07:28:26

+0

确定您的xpath根目录是否正常?尝试“//评论()”以确保。 – annakata 2009-04-24 07:56:48

19

使用注释()函数: -

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

选择下面的长度元件的第一评论。

编辑

马诺在问这个答案为什么这不是在MSXML工作的评论。原因将是你使用的是MSXML3。默认情况下,MSXML3不使用XPath作为其选择语言,它默认使用较早的较弱语言(XSL模式)。您需要通过DOMDocument的setProperty方法将XPath设置为选择语言。 E.g(在JScript): -

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

现在全XPath语言会在你的查询工作(注意一个重大更改是索引谓词是基于XPath中1,而他们基于XSL模式为0)。

1

也许这coud帮助, 此示例删除评论

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

从这里link text

3

基于业务方案的意见,发布答案(和我的好奇,为什么这个简单的东西是行不通的凑近),这里是我的建议:

使用@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,您需要查询其datatext属性。