XPath - 如何从xml获取图像源

时间:2015-06-11 14:21:28

标签: xpath

您好我有这个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但它不起作用

有什么解决方案吗?

1 个答案:

答案 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> 之间有空格,它就会失败。但如果确切的格式是可预测的,那你就没问题了。