Мне нужно выбрать определенный набор тегов, который содержит определенное значение внутри тега. Например, ниже находится источник.XML-файл

<main tag>
<subTag1>1298</subTag1>
<subTag2>fg</subTag2>
<subTag3>34</subTag3>
</main tag>

<main tag>
<subTag1>1299</subTag1>
<subTag2>cfinfo</subTag2>
<subTag3>43</subTag3>
</main tag>

<main tag>
<subTag1>1300</subTag1>
<subTag2>BBcycle</subTag2>
<subTag3>55</subTag3>
</main tag>

Мне нужно выбрать все содержимое значений основного тега, значение subTag1 которых равно 1300, в другой XML. Ожидаемый результат, если значение subTag1 задано как 1300, приведено ниже.(Результат.XML)

<main tag>
<subTag1>1300</subTag1>
<subTag2>BBcycle</subTag2>
<subTag3>55</subTag3>
</main tag>

Точно так же мне нужно выбрать элементы основного тега с набором значений subTag1.Ожидаемый результат, если значение subTag1 задано как 1299 и 1300, ниже.(Результат.XML)

    <main tag>
    <subTag1>1299</subTag1>
    <subTag2>cfinfo</subTag2>
    <subTag3>43</subTag3>
    </main tag>

    <main tag>
    <subTag1>1300</subTag1>
    <subTag2>BBcycle</subTag2>
    <subTag3>55</subTag3>
    </main tag>

PS: между тегами нет разрыва строки, добавлено для лучшего понимания. В реальном случае есть много основных тегов, и у меня есть набор значений SubTag1 для выборки соответствующих блоков основного тега, как в примере выше (для создания в одном результирующем XML-файле). Было бы целесообразно, чтобы пользователь сценария мог предоставить набор значений subTag1 для поиска в SOURCE.XML.

Я думал об использовании grep, но это не поможет в выборе набора тегов. Мне нужно сделать это с помощью сценариев оболочки UNIX.

2 ответа2

0

Я бы пошел с

grep -A 3 -B 1 '<subTag1>1300</subTag1>' infile.xml > outfile.xml

-A строки после контекста. -B выделить строки перед контекстом

который хорошо выводит

<main tag>
<subTag1>1300</subTag1>
<subTag2>BBcycle</subTag2>
<subTag3>55</subTag3>
</main tag>
0

Вам нужен инструмент для разбора XML. xmlstarlet мой любимый. После исправления вашего неверного XML, мы имеем

$ xmlstarlet ed -d '//main_tag[subTag1 != 1300]' file.xml
<?xml version="1.0"?>
<root_tag>
  <main_tag>
    <subTag1>1300</subTag1>
    <subTag2>BBcycle</subTag2>
    <subTag3>55</subTag3>
  </main_tag>
</root_tag>

а также

$ xmlstarlet ed -d '//main_tag[subTag1 != 1300 and subTag1 != 1299]' file.xml
<?xml version="1.0"?>
<root_tag>
  <main_tag>
    <subTag1>1299</subTag1>
    <subTag2>cfinfo</subTag2>
    <subTag3>43</subTag3>
  </main_tag>
  <main_tag>
    <subTag1>1300</subTag1>
    <subTag2>BBcycle</subTag2>
    <subTag3>55</subTag3>
  </main_tag>
</root_tag>

Я считаю эту страницу полезным руководством для xpath.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .