您好我有这个xml
<item>
<title> Something for title»</title>
<link>some url</link>
<description><![CDATA[<div class="feed-description"><div class="feed-image"><img src="pictureUrl.jpg" /></div>text for desc</div>]]></description>
<pubDate>Thu, 11 Jun 2015 16:50:16 +0300</pubDate>
</item>
我尝试使用路径获取img src://description//div[@class='feed-description']//div[@class='feed-image']//img/@src
但它不起作用
有什么解决方案吗?
答案 0 :(得分:1)
CDATA部分会转义其内容。换句话说,CDATA防止在解析文档的其余部分时将其内容解析为标记。因此,<div>
中的<description>
不被视为XML元素,仅作为平面文本。 <div>
元素没有元素子元素......只有一个文本子元素。因此,XPath无法选择<description>
的任何//div[@class='feed-description']//div[@class='feed-image']//img/@src
后代,因为在解析的XML树中不存在。
怎么办?
如果您的XPath环境支持XPath 3.0,您可以使用parse-xml()将平面文本转换为树,然后使用XPath从结果树中选择substring-before()
。
否则,您最好的解决方法可能是使用原始字符串处理函数,如substring-after()
,match()
或substring-before(substring-after(//description, 'img src="'), '"')
。 (后者使用正则表达式并需要XPath 2.0。)当然,很多人会告诉你不要使用正则表达式来分析XML和HTML等标记。有充分理由:在一般情况下,很难做到正确(使用正则表达式或使用纯字符串搜索)。但对于非常有限的情况,输入是高度可预测的,并且没有更好的工具,它可能是不太理想的工作的最佳工具。
例如,对于问题中显示的数据,您可以使用
substring-after(//description, 'img src="')
在这种情况下,内部调用pictureUrl.jpg" /></div>text for desc</div>
返回"
,pictureUrl.jpg
之前的子字符串为src
。
这不是很强大,例如,如果=
和<a ng-href="{{myVar}}" >x</a>
之间有空格,它就会失败。但如果确切的格式是可预测的,那你就没问题了。