Как разобрать XML в Bash? - PullRequest
124 голосов
/ 21 мая 2009

В идеале я бы хотел иметь возможность:

cat xhtmlfile.xhtml |
getElementViaXPath --path='/html/head/title' |
sed -e 's%(^<title>|</title>$)%%g' > titleOfXHTMLPage.txt

Ответы [ 15 ]

2 голосов
/ 24 октября 2010

После некоторых исследований по переводу между форматами Linux и Windows путей к файлам в XML-файлах я нашел интересные учебные пособия и решения:

2 голосов
/ 21 мая 2009

Ну, вы можете использовать утилиту xpath. Я думаю, что Perl XML :: Xpath содержит его.

0 голосов
/ 15 октября 2018

Введение

Большое спасибо за предыдущие ответы. Заголовок вопроса очень неоднозначный, так как вопросник спрашивает о том, как проанализировать xml, когда то, что на самом деле хочет проанализировать вопросник xhtml, говорить о неоднозначности. Хотя они похожи, они определенно не одинаковы. И поскольку xml и xhtml не одно и то же, было очень трудно найти решение, которое точно соответствовало бы тому, что запрашивала анкета. Однако я надеюсь, что решение, приведенное ниже, все же подойдет. Хочу признаться, я не мог узнать, как искать именно для /html/head/title. Теперь, когда об этом написано, я хочу сказать, что я не удовлетворен ранее полученными ответами, так как некоторые из ответчиков без необходимости заново изобретают колесо , когда в анкете не говорилось, что скачивать пакет запрещено . Я не понимаю ненужного кодирования вообще. Я специально хочу повторить то, что человек в этой теме уже сказал: просто потому, что вы можете написать свой собственный парсер, не значит, что вы должны - @Stephen Niedzielski. Относительно программирования: самый простой и кратчайший путь - это правило, которое предпочитают, никогда не делайте ничего более сложного, чем когда-либо необходимо. Решение было протестировано с хорошим результатом на Windows 10> Подсистема Windows для Linux> Ubuntu . Возможно, если будет существовать и выбран другой элемент title, это будет плохой результат, извините за такую ​​возможность. Пример: если теги <body> предшествуют тегам <head>, а теги <body> содержат тег <title>, но это очень, очень маловероятно.

TLDR / решение

Об общем пути для решения, спасибо @Grisha, @Nat, Как разобрать XML в Bash?

За удаление тегов XML, спасибо @Johnsyweb, Как удалить теги XML из командной строки Unix?

1. Установить «пакет» xmlstarlet

2. Выполнить в bash xmlstarlet sel -t -m "//_:title" -c . -n xhtmlfile.xhtml | head -1 | sed -e 's/<[^>]*>//g' > titleOfXHTMLPage.txt

0 голосов
/ 24 января 2013

Метод Юзема можно улучшить, изменив порядок знаков < и > в функции rdom и присваивания переменных, так что:

rdom () { local IFS=\> ; read -d \< E C ;}

становится:

rdom () { local IFS=\< ; read -d \> C E ;}

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

0 голосов
/ 16 июня 2012

Это работает, если вам нужны атрибуты XML:

$ cat alfa.xml
<video server="asdf.com" stream="H264_400.mp4" cdn="limelight"/>

$ sed 's.[^ ]*..;s./>..' alfa.xml > alfa.sh

$ . ./alfa.sh

$ echo "$stream"
H264_400.mp4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...