У меня есть файл 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>
Все элементы строятся одинаково. Используя XMLLint с XPath, я пытаюсь получить список всех URL-адресов. Однако до сих пор я не нашел лучшего способа сделать это. Вот некоторые из способов, которые я пробовал:
xmllint --xpath "string(/root/item/mediaList/URL)" file.xml >> log.txt
Этот возвращает хороший URL, но останавливается после первого элемента (давая мне только 1 изображение)
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[]]>
вокруг него, и снова все в одной строке.
Я также пробовал перебирать элементы, но это было очень медленно и не работало должным образом.
Результат, к которому я стремлюсь, - это текстовый файл со всеми изображениями ниже друг друга, например:
http://example.com/image1.jpg
http://example.com/image2.jpg
http://example.com/image3.jpg
http://example.com/image4.jpg
--nocdata
извлекает текст из каждого узла CDATA. Однако я не уверен, как получить каждый URL-адрес в отдельной строке. - person chepner   schedule 14.02.2017