我有一个包含大量媒体字段的XML文件。一段示例XML是:
<root>
<item>
<name>Item 1</name>
<mediaList>
<media>
<name>Name 1</name>
<URL><![CDATA[http://example.com/image1.jpg]]></URL>
</media>
<media>
<name>Name 2</name>
<URL><![CDATA[http://example.com/image2.jpg]]></URL>
</media>
</mediaList>
</item>
<item>
<name>Item 2</name>
<mediaList>
<media>
<name>Name 3</name>
<URL><![CDATA[http://example.com/image3.jpg]]></URL>
</media>
<media>
<name>Name 4</name>
<URL><![CDATA[http://example.com/image4.jpg]]></URL>
</media>
</mediaList>
</item>
</root>
所有项目都以相同的方式构建。在XPath中使用XMLLint,我试图获取所有URL的列表。但是,到目前为止,我还没有找到最佳方法。我试过的一些方法是:
xmllint --xpath "string(/root/item/mediaList/URL)" file.xml >> log.txt
这个返回一个不错的网址,但在第一个项目后停止(仅给我一张图片)
xmllint --xpath "/root/item/mediaList/URL" file.xml >> log.txt
这为我提供了所有项目,但所有项目都在同一行,每个项目显示为<URL><![CDATA[http://example.com/image.jpg]]></URL>
。
xmllint --xpath "/root/item/mediaList/URL/text()" file.xml >> log.txt
这是最接近的,但仍然会返回它周围的<![CDATA[]]>
标记,并且还会在一行中返回。
我也试过循环浏览这些项目,但这非常慢,并且没有按预期工作。
我的目标是一个txt文件,所有图像都在彼此之下,如下所示:
http://example.com/image1.jpg
http://example.com/image2.jpg
http://example.com/image3.jpg
http://example.com/image4.jpg
答案 0 :(得分:2)
Foo<T, int>
不支持多个XPath匹配的xmllint
。 (因此它只显示第一个结果)。
您可以使用string(...)
之类的:
xmlstarlet
并生成
xmlstarlet sel -T -t -m /root/item/mediaList/media/URL -v . -n file.xml
或perl(安装了XML::LibXML模块):
http://example.com/image1.jpg
http://example.com/image2.jpg
http://example.com/image3.jpg
http://example.com/image4.jpg
也会产生与上面相同的结果。
答案 1 :(得分:0)
我认为您应该在W3C Document中更改解析器:
CDATA部分中的每个字符都被视为字符数据。 因此,&lt;![CDATA [&lt;]]&gt;在源文件中将处理相同 &LT ;.两者都将导致单个&lt;中的文本节点中的字符 树。因此,CDATA部分被视为&lt;![CDATA [和]]&gt;。 被删除并且每次出现&lt;和&amp;被替换为&lt;和 &安培;分别
CDATA将自动删除,我在python中测试:
tree = etree.fromstring(xml)
tree.xpath('//URL/text()')
出:
['http://example.com/image1.jpg',
'http://example.com/image2.jpg',
'http://example.com/image3.jpg',
'http://example.com/image4.jpg']
您的XPath是正确的。