使用xmllint提取多个相同命名字段的字段

时间:2017-02-14 11:46:04

标签: xml bash xpath xmllint

我有一个包含大量媒体字段的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

2 个答案:

答案 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是正确的。