Извлечение XML элементов на основе внутреннего содержимого - PullRequest
0 голосов
/ 18 марта 2020

У меня есть огромный XML документ (более 12 ГБ), который мне нужно проанализировать следующим образом ...

С учетом такой структуры:

<person name=Alice>
   <colour>blue</colour>
</person>

<person name=Bob>
   <colour>green</colour>
</person>

<person name=Charles>
   <colour>blue</colour>
</person>

Я хотел бы извлечь в отдельный файл только те элементы person, которые содержат подполе <colour> blue </colour>.

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

<person name=Alice>
   <colour>blue</colour>
</person>

<person name=Charles>
   <colour>blue</colour>
</person>

Я пытался использовать grep и sed, так как они очень полезны для этой цели и также могут управлять огромными файлами, такими как мои, но я не Я уверен, что мне нужно использовать регулярное выражение.

Заранее спасибо!

РЕДАКТИРОВАТЬ : как я уже отметил, мне нужен инструмент на основе потоков, иначе программа просто вылетает! Я пробовал xmlstarlet, но программа автоматически уничтожается (я полагаю, из-за использования памяти).

EDIT2 : Я также пытался разделить файл с помощью xml_split, но количество генерируемых подфайлов просто не поддается обработке. Итак, какие-либо предложения?

1 Ответ

0 голосов
/ 20 марта 2020

Поскольку ни один из XML осведомленных инструментов, которые вы пробовали до сих пор, не работает для вас, и если ваш ввод такой же простой и регулярный, как вы отправили, тогда:

$ awk -v RS= -v ORS='\n\n' '/<colour>blue</' file
<person name=Alice>
   <colour>blue</colour>
</person>

<person name=Charles>
   <colour>blue</colour>
</person>

Если это НЕ все, что вам нужно затем отредактируйте свой вопрос, чтобы обеспечить более репрезентативный пример ввода / вывода.

...