我想从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="
,但也许有更好,更清洁的解决方案来提取链接?
如果您的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
您需要深入研究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>