从XML的cdata文本中提取img src

问题描述 投票:0回答:2

我想从XML文件中提取img src值。

测试输入:

<ROOT>
   <ITEM>
      <DESCRIPTION><![CDATA[<p align="left" dir="ltr">
    <span lang="EN">lorem ipsum</span></p>
<p>
    some text</p>
<p>
    <img alt="" src="https://example.com/hello.jpg" /></p>
]]></DESCRIPTION>
    </ITEM>
</ROOT>         

什么是最好的方法?使用XSLT或XML解析器,例如xmllint吗?

当前我正在尝试使用xmllint:

xmllint --xpath '//ROOT/ITEM/DESCRIPTION/text()' input.xml | egrep -o 'src=".*(\.png|\.jpg)'

...但输出类似于:

src="https://example.com/hello.jpg

确定可以使用sed之类的工具删除src=",但也许有更好,更清洁的解决方案来提取链接?

xslt xml-parsing xmllint
2个回答
1
投票

如果您的CDATA节不在CDATA节中,则如果它是格式正确的XML,则可以将xmllint的输出传递给xmllint,以便将CDATA解析为XML。

在您的特定示例中,您必须将输出包装在另一个元素中(例如,x)以使其格式正确。

示例...

xmllint --xpath 'concat("<x>",string(//ROOT/ITEM/DESCRIPTION),"</x>")' input.xml | xmllint --xpath 'string(//img/@src)' -

输出...

https://example.com/hello.jpg

0
投票

您需要深入研究parse-xml-fragment中的XPath 3或XSLT 3:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">    

  <xsl:output method="text" indent="yes" html-version="5"/>

  <xsl:template match="/">
     <xsl:value-of select="ROOT/ITEM/DESCRIPTION/parse-xml-fragment(.)//img/@src"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/3NSSEv7

Saxon 9.9 HE在.NET,Java和C / C ++ / Python版本中可以运行/使用XSLT 3。

如果CDATA包含格式不正确的X(HT)ML的HTML,则可以使用由David Carlisle在XSLT 2(https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl)中实现的HTML解析器:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:html-parser="data:,dpc"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:import href="https://github.com/davidcarlisle/web-xslt/raw/master/htmlparse/htmlparse.xsl"/>

  <xsl:output method="text"/>

  <xsl:template match="/">
     <xsl:value-of select="ROOT/ITEM/DESCRIPTION/html-parser:htmlparse(., '', true())//img/@src"/>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/3NSSEv7/1

© www.soinside.com 2019 - 2024. All rights reserved.