Извлечь содержимое тега на основе значения другого квалификатора тега, используя xmllint - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь использовать xmllint для извлечения данных из тега, если в предыдущем теге существует условие.Я знаю, что, возможно, есть лучшие инструменты, но я ограничен стандартными командами xmllint и / или системой, такими как sed, awk и т. Д.

xml file:

<?xml version="1.0" encoding="UTF-8"?>
<MainGroup>
<MainGroupEntry name="aaa" function="xxx">
    <EntryType type="AAA"/>
    <EntryDescription>Capture This A</EntryDescription>
    <EntryRandomList>Just,a,random,list,of,things,to,discard</EntryRandomList>
</MainGroupEntry>
<MainGroupEntry name="aaa" function="xxx">
    <EntryType type="AAA"/>
    <EntryDescription>Capture This A</EntryDescription>
    <EntryRandomList>Just,a,random,list,of,things,to,discard</EntryRandomList>
</MainGroupEntry>
<MainGroupEntry name="bbb" function="yyy">
    <EntryType type="BBB"/>
    <EntryDescription>Capture This B</EntryDescription>
    <EntryRandomList>Just,a,random,list,of,things,to,discard</EntryRandomList>
</MainGroupEntry>
<MainGroupEntry name="bbb" function="yyy">
    <EntryType type="BBB"/>
    <EntryDescription>Capture This B</EntryDescription>
    <EntryRandomList>Just,a,random,list,of,things,to,discard</EntryRandomList>
</MainGroupEntry>
</MainGroup>

What I'm "я пытаюсь сделать следующее: для каждого Entry type="AAA" выведите сопровождающее EntryDescription. Я пробовал разные варианты: xmllint --xpath '//MainGroupEntry/EntryType[@type="AAA"]/EntryDescription/text()' my_file.xml, но я всегда получаю пустой набор XPath. Если я уроню, пытаясь получить текст описания, я могупосмотрите записи, которые соответствуют моему условию типа:

xmllint --xpath '//MainGroupEntry/EntryType[@type="AAA"]' my_file.xml <EntryType type="AAA"/><EntryType type="AAA"/>

Я просто не могу понять, как получить текст только из поля «Описание». Мысли?

1 Ответ

1 голос
/ 24 апреля 2019

Вы можете использовать ось following-sibling и функцию text() для извлечения только текста из описания:

xmllint --xpath '/MainGroup/MainGroupEntry/EntryType[@type="AAA"]/following-sibling::EntryDescription/text()' file.xml

Чтобы отделить тексты, вы можете использовать опцию --shell с cat:

echo 'cat /MainGroup/MainGroupEntry/EntryType[@type="AAA"]/following-sibling::EntryDescription/text()' \
| xmllint --shell file.xml

Может потребоваться | grep -v ' -----\|/ >' вывод, чтобы удалить разделители и запрос.

...