Как использовать XMLSTARLET для чтения значения из большого файла XML?

1

У меня очень большой XML-файл, и мне просто нужно прочитать значения из него. До сих пор я не был успешным с XMLSTARLET. Я использую «sel», а затем пытаюсь указать путь к предмету, но безуспешно. Я понятия не имею, какие дополнительные символы или поля использовать. Вся строка? Кронштейны? Есть также инструмент под названием «xml_grep», который, я предполагаю, использовал бы пути с unix-подобными скобками, чтобы получить значения.

Есть идеи?

gmark
источник

Ответы:

0

Я полагаю, вы хотите получить значения определенных элементов в этом 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
PBI
источник