2014-10-07 167 views
1

以下是我的xml结构。无法使用包含编码特殊字符的xpath获取数据

<City name="BELLMORE" > 
    <SiteName name="MILL POND AUTO BODY" > 
    <SiteStreet>3000 Merrick Rd</SiteStreet> 
    <ZipCode>11710</ZipCode> 
    </SiteName> 
    <SiteName name="STS TIRE &amp; AUTO CENTERS" > 
    <SiteStreet>CHG Sunrise Hwy</SiteStreet> 
    <ZipCode>11710</ZipCode> 
    </SiteName> 
    <SiteName name="AUTO CONNECTION" > 
    <SiteStreet>2860 Sunrise Hwy</SiteStreet> 
    <ZipCode>11710</ZipCode> 
    </SiteName> 
    <SiteName name="PERRY&#39;S AUTO" > 
    <SiteStreet>1703 Newbridge Rd</SiteStreet> 
    <ZipCode>11710</ZipCode> 
    </SiteName> 
</City> 

我能够在使用以下xpath查询时查找数据。

//City[@name='BELLMORE']/SiteName[@name='AUTO CONNECTION']/SiteStreet/text() 

但是,当我使用以下XPath查询

//City[@name='BELLMORE']/SiteName[@name='PERRY&#39;S AUTO']/SiteStreet/text() 

它不返回任何东西。我已经在xml中转换了特殊字符。

回答

1

的XPath看到解析XML,所以你需要检查的实际字符,而不是字符引用:

//City[@name="BELLMORE"]/SiteName[@name="PERRY'S AUTO"] 

XPath字符串字面量可以用单或者双引号分隔,如果要包括字面上的单引号字符,那么它必须用双引号分隔。

当你看到在使用另一种主机语言(如Java或XSLT)编写的源代码中使用XPath表达式的例子时,其中构成XPath表达式的字符受制于引用规则的主机语言。例如,在Java中的上述表达可能是这样的:

String xpath = "//City[@name=\"BELLMORE\"]/SiteName[@name=\"PERRY'S AUTO\"]"; 

或者在XSLT它可能看起来像任何一种:

<xsl:value-of select='//City[@name="BELLMORE"]/SiteName[@name="PERRY&apos;S AUTO"]' /> 
<xsl:value-of select="//City[@name=&quot;BELLMORE&quot;]/SiteName[@name=&quot;PERRY'S AUTO&quot;]" /> 

表达式本身仍含有各种单,双引号字符,但如何这些字符表示取决于主机语言。

+0

非常感谢你... – 2014-10-07 16:59:09

+0

这个解决方案是否适用于所有特殊字符? – 2014-10-07 17:03:17

+0

@VimalPatel对XPath 1.0中字符串文字的唯一限制是单引号文字不能包含单引号,而双引号文字不能包含双引号,但除此之外什么都行。在XPath 2.0中,你可以通过加倍的方式来转义定界引用类型 - 'PERRY'的'AUTO'代表字符串'PERRY'S AUTO',但是1.0没有转义机制,所以你必须用'concat ()'如果你想在同一个字符串中包含两种类型的引用。 – 2014-10-07 17:05:35