SelectNodes,其属性包含撇号

时间:2011-10-23 09:26:12

标签: c#-4.0 xpath

我正在尝试使用SelectNodes,其中属性包含带有撇号的文本

属性是oor:path,节点如下所示:

<item oor:path="/org.openoffice.Office.Histories/Histories/org.openoffice.Office.Histories:HistoryInfo['PickList']/OrderList">

我尝试过这段代码(并且失败了)......

XmlNodeList xnList = xml.SelectNodes("/oor:items/item[contains(@oor:path, '[&apos;PickList&apos;]/OrderList')]", nsMgr);

请帮助!

// Anders

2 个答案:

答案 0 :(得分:1)

在XPath解析器可以看到之前,&apos;个实体被解析为单引号。因此,从它的角度来看,它们不能与“真正的”单引号区别开来。

您可以使用转义双引号将参数分隔为contains(),并在表达式中使用单引号:

XmlNodeList xnList = xml.SelectNodes(
    "/oor:items/item[contains(@oor:path, \"['PickList']/OrderList\")]", nsMgr);

或者,使用逐字字符串文字:

XmlNodeList xnList = xml.SelectNodes(
    @"/oor:items/item[contains(@oor:path, ""['PickList']/OrderList"")]", nsMgr);

答案 1 :(得分:0)

您可以使用

//item[contains(@oor:path, &quot;['PickList']/OrderList&quot;)]

基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:oor="hmm: oor">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "//item[contains(@oor:path, &quot;['PickList']/OrderList&quot;)]
     "/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<item xmlns:oor="hmm: oor"
oor:path="/org.openoffice.Office.Histories/Histories/org.openoffice.Office.Histories:HistoryInfo['PickList']/OrderList"/>

将所需的正确选择的节点复制到输出

<item xmlns:oor="hmm: oor" oor:path="/org.openoffice.Office.Histories/Histories/org.openoffice.Office.Histories:HistoryInfo['PickList']/OrderList"/>