2013-11-22 2 views
0

У меня есть файл XML, который имеет содержание, подобные ниже:Строка поиска в UNIX

<tag> 
    <sub>...</sub> 
    <msg>....</msg> 
</tag> 
<tag> 
    <sub>...</sub> 
</tag> 
<tag> 
    <sub>...</sub> 
    <msg>....</msg> 
</tag> 
<tag> 
    <sub>...</sub> 
</tag> 
<tag> 
    <sub>...</sub> 
    <msg>....</msg> 
</tag> 
<tag> 
    <sub>...</sub> 
</tag> 

Мне нужен скрипт, который скользит через весь файл XML и выполнять поиск в пределах каждого <tag>...</tag>. Внутри каждого <tag>, если присутствует <msg>, выполните действие 1, и если <msg> нет, выполните действие 2. Как это сделать?

+1

Я рекомендую вам использовать XMLStarlet и извлекать данные, используя выражение XPath. Shell может сделать все остальное. – tvm

+0

Что такое действие 1 и 2? – pfnuesel

+0

У вас есть xmllint? – Antarus

ответ

0

Это звучит как работа для XSLT

Учитывая это test.xml:

<document> 
<tag n="1"> 
    <sub>...</sub> 
    <msg>....</msg> 
</tag> 
<tag n="2"> 
    <sub>...</sub> 
</tag> 
<tag n="3"> 
    <sub>...</sub> 
    <msg>....</msg> 
</tag> 
<tag n="4"> 
    <sub>...</sub> 
</tag> 
<tag n="5"> 
    <sub>...</sub> 
    <msg>....</msg> 
</tag> 
<tag n="6"> 
    <sub>...</sub> 
</tag> 
</document> 

Вот пример нескольких XPATH выражений

  • "тег" тегов, которые имеют a "msg" child

    $ xmlstarlet sel -t -v '//tag[msg]/@n' test.xml 
    1 
    3 
    5 
    
  • метки «помечать», которые не имеют «Сообщ» ребенок

    $ xmlstarlet sel -t -v '//tag[not(msg)]/@n' test.xml 
    2 
    4 
    6 
    
Смежные вопросы