【问题标题】:XPath - How to get image source from xmlXPath - 如何从 xml 获取图像源
【发布时间】:2015-06-11 14:21:28
【问题描述】:

你好,我有这个 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>

我尝试使用路径://description//div[@class='feed-description']//div[@class='feed-image']//img/@src 获取 img src,但它不起作用

有什么解决办法吗?

【问题讨论】:

  • 不起作用,因为该 html 在 cdata 块内。它基本上是&lt;description&gt; 元素内的一大块文本。您必须提取 &lt;description&gt; 的文本内容,然后将其输入新的 dom 解析器并对其进行 src 提取。

标签: xpath


【解决方案1】:

CDATA 部分转义其内容。换句话说,当解析文档的其余部分时,CDATA 会阻止其内容被解析为标记。所以其中的&lt;div&gt;s 不被视为XML 元素,而只是作为平面文本。 &lt;description&gt; 元素没有子元素……只有一个文本子元素。因此,XPath 无法选择 &lt;description&gt; 的任何 &lt;div&gt; 后代,因为解析的 XML 树中不存在任何后代。

怎么办?

如果您的 XPath 环境支持 XPath 3.0,您可以使用 parse-xml() 将平面文本转换为树,然后使用 XPath 从生成的树中选择 //div[@class='feed-description']//div[@class='feed-image']//img/@src

否则,您最好的解决方法可能是使用原始字符串处理函数,例如 substring-before()substring-after()match()。 (后者使用正则表达式,需要 XPath 2.0。)当然,很多人会告诉你不要使用正则表达式来分析 XML 和 HTML 之类的标记。有充分的理由:在一般情况下,很难做到正确(使用正则表达式或纯字符串搜索)。但是对于输入高度可预测且缺乏更好工具的非常有限的情况,它可能是完成不太理想的工作的最佳工具。

例如,对于您问题中显示的数据,您可以使用

substring-before(substring-after(//description, 'img src="'), '"')

此时内部调用substring-after(//description, 'img src="')返回pictureUrl.jpg" /&gt;&lt;/div&gt;text for desc&lt;/div&gt;,其中"之前的子串为pictureUrl.jpg

这不是很健壮,例如,如果src= 之间有空格,它将失败。但是,如果确切的格式是可预测的,那么您就可以了。

【讨论】:

  • 感谢您的回复。如何使用 substring-before() 或 substring-after() 获取 img 源。抱歉,我对 xpath 很陌生
猜你喜欢
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多