Извлечение данных из простого XML-файла

У меня есть XML-файл с содержимым:

 programming 

Мне нужен способ извлечь то, что находится в тегах , programmin в этом случае. Это должно быть сделано в командной строке linux, используя grep / sed / awk.

9 Solutions collect form web for “Извлечение данных из простого XML-файла”

Вам действительно нужно использовать только те инструменты? Они не предназначены для обработки XML, и хотя можно получить что-то, что работает нормально большую часть времени, оно не будет работать в крайних случаях, таких как кодирование, разрывы строк и т. Д.

Я рекомендую xml_grep:

 xml_grep 'job' jobs.xml --text_only 

Что дает результат:

 programming 

В ubuntu / debian xml_grep находится в пакете xml-twig-tools.

  grep '"|cut -f1 -d"< " 

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

Такие вещи, как унарные tags и перенос переменных строк – эти fragmentы говорят «одно и то же:

         

Надеюсь, это объясняет, почему создание парсера с регулярным выражением / линией затруднено? К счастью, вам не нужно. Многие языки сценариев имеют как минимум один, а иногда и более синтаксический анализ.

Как уже упоминалось в xml_grepxml_grep доступен. На самом деле это инструмент, основанный на библиотеке XML::Twig perl. Однако то, что он делает, это использовать выражения «xpath», чтобы найти что-то и различать структуру документа, атрибуты и «контент».

Например:

 xml_grep 'job' jobs.xml --text_only 

Однако в интересах получения более качественных ответов, вот несколько примеров «сворачивать свои собственные» на основе исходных данных:

Первый путь:

Используйте twig handlers которые захватывают элементы определенного типа и действуют на них. Преимущество этого метода заключается в том, что он анализирует XML «как вы идете» и позволяет вам изменять его в полете, если вам нужно. Это особенно полезно для отбрасывания «обработанного» XML, когда вы работаете с большими файлами, используя purge или flush :

 #!/usr/bin/perl use strict; use warnings; use XML::Twig; XML::Twig->new( twig_handlers => { 'job' => sub { print $_ ->text } } )->parse( <> ); 

Который будет использовать <> для ввода ввода ( ./myscript somefile.xml или указан через ./myscript somefile.xml ) и обрабатывать его – каждый элемент job , он будет извлекать и печатать любой связанный текст. (Возможно, вы захотите print $_ -> text,"\n" чтобы вставить строку перевода).

Поскольку он соответствует элементам «задания», он также будет соответствовать на вложенных элементах работы:

 programming anotherjob  

Сопоставим дважды, но дважды напечатайте часть вывода. Тем не менее, если вы предпочитаете, вместо этого вы можете совместить /job . Использование – это позволяет вам, например, печатать и удалять элемент, а также копировать и вставлять одну модификацию структуры XML.

Альтернативно – сначала проанализируйте и «распечатайте» на основе структуры:

 my $twig = XML::Twig->new( )->parse( <> ); print $twig -> root -> text; 

Поскольку job является вашим корневым элементом, все, что нам нужно, это распечатать его текст.

Но мы можем быть немного более проницательными и искать job или /job и печатать, а именно:

 my $twig = XML::Twig->new( )->parse( <> ); print $twig -> findnodes('/job',0)->text; 

Вы можете использовать параметр XML::Twig s pretty_print для переформатирования своего XML:

 XML::Twig->new( 'pretty_print' => 'indented_a' )->parse( <> ) -> print; 

Существует множество вариантов выходного формата, но для более простого XML (например, вашего) большинство будет выглядеть довольно похоже.

просто используйте awk, не нужно использовать другие внешние инструменты. Ниже работает, если ваши нужные tags отображаются в многострочном формате.

 $ cat file test programming  programming $ awk -vRS="" '{gsub(/.*/,"");print}' file programming programming 

Использование xmlstarlet:

 echo 'programming' | \ xmlstarlet sel -N var="http://www.sample.com/" -t -m "//var:job" -v '.' 

Предположим, что такая же строка, вход из stdin:

 sed -ne '/< \/job>/ { s/< [^>]*>\(.*\)< \/job>/\1/; p }' 

Примечания: -n останавливает вывод автоматически; -e означает, что это однострочный (aot скрипт) /< \/job> действует как grep; s удаляет атрибуты opentag + и endtag; ; это новое заявление; печатные издания; {} делает grep применимым к обоим утверждениям, как к одному.

Использование команды sed :

Пример:

 $ cat file.xml  Tove Jani Reminder Don't forget me this weekend!  $ cat file.xml | sed -ne '//s#\s*< [^>]*>\s*##gp' Reminder 

Объяснение:

cat file.xml | sed -ne '//s#\s*< [^>]*>\s*##gp'

n – подавление печати всех строк
e сценарий

// – находит строки, содержащие указанный шаблон, который может быть, например,

next является частью замены s///p которая удаляет все, кроме желаемого значения, где / заменяется на # для лучшей читаемости:

s#\s*< [^>]*>\s*##gp
\s* – включает белые пробелы, если они существуют (то же самое в конце)
< [^>]*> представляет как альтернативную причину регулярного выражения. < .*?> не работает для sed
g – заменяет все, например, закрытие xml

Как насчет:

 cat a.xml | grep '' -f 2 | cut -d '< ' -f 1 

Немного поздно к шоу.

xmlcutty вырезает узлы из XML:

 $ cat file.xml < ?xml version="1.0" encoding="utf-8"?> programming designing managing teaching 

Аргумент path указывает путь к элементу, который вы хотите вырезать. В этом случае, поскольку мы вообще не интересуемся тегами, мы переименовываем тег в \n , поэтому получаем хороший список:

 $ xmlcutty -path /job -rename '\n' file.xml programming designing managing teaching 

Обратите внимание, что XML недействителен для начала (без корневого элемента). xmlcutty может работать со слегка сломанным XML.

  • Что означает X в ASPX, DOCX, XLSX, PPTX и т. Д.?
  • Получение значения XML-узла в Java DOM
  • Android получает значение от выбранного радиообмена
  • Как я могу вывести org.w3c.dom.Element в строковый формат в java?
  • JAXB: как отобразить карту в значение
  • Текущий узел или узел контекста в XSLT / XPath?
  • Использование JAXB для перекрестных ссылок XmlID из двух XML-файлов
  • Лучший способ кодирования текстовых данных для XML в Java?
  • В чем разница между xsd: include и xsd: import?
  • Как добавить узел в существующий файл XML в java
  • JAXB: Как мне объединить сложные вложенные структуры данных?
  • Interesting Posts
    Давайте будем гением компьютера.