Я полагаю, вы хотите получить значения определенных элементов в этом XML-файле, и вы уже знаете, как указать их с помощью Xpath, например //employee[@retired="no"]
:
Затем, чтобы получить значение этого единственного поля
xmlstarlet sel -t -v '//employee[@retired="no"]/name' thefile.xml
Или когда вы хотите, например, 2 элемента от каждого сотрудника, разделенных символом канала:
xmlstarlet sel -t -m '//employee[@retired="no"]' -v name -o "|" -v "age" -nl file.xml
По сути, вы указываете шаблон (-t), за которым следует, где шаблон должен быть применен (-m, затем Xpath, где нужно найти соответствие), а затем элементы, которые вы хотите извлечь из этого (-v для значения) ,
Программа "xml_grep", с другой стороны, является частью XML :: Twig. Идея XML :: Twig заключается в том, что он не читает весь XML-файл в память, а работает с веткой файла с помощью ветки. И это приводит к тому, что вы не можете указать определенные пути Xp (например, ветки, ссылающиеся на элементы одного уровня). Когда XPath достаточно просты, чтобы их можно было указывать только по принципу «веточка за веткой», тогда эта программа действительно позволяет обрабатывать очень большие файлы, используя при этом только ограниченный объем памяти.
Вы не предоставили достаточно информации о структуре XML-файла или типе XPath, которые вы хотите, чтобы значения могли помочь здесь.
И, конечно же, поскольку XML - это просто текстовый формат, в зависимости от формата файла и сложности вопросов, может быть, даже другие простые текстовые программы тоже могут работать:
grep -o '<name>[^<]*</name>' file.xml