У меня есть XML-файл, содержащий множество данных конфигурации. Я говорю «XML-like», потому что это действительно как 3 XML-файла, объединенных вместе, разделенных «]]>]]>«Отступ XML-файл с awk и xmllint
E.g.
<?xml version="1.0" encoding="UTF-8"?>
<hello><world>"Earth"</world></hello>]]>]]><?xml version="1.0" encoding="UTF-8"?>
<data><lemur><type>"Ring-tailed"</type></lemur></data>]]>]]><?xml version="1.0" encoding="UTF-8"?>
<data><lemur><type>"Mouse"</type></lemur></data>]]>]]>
Я пытаюсь написать сценарий, который будет вызывать xmllint, чтобы отступать все теги XML в файле. Тем не менее, xmllint (и многие другие программы форматирования xml), похоже, требует, чтобы в файле был только один XML-документ. Например. файл должен начинаться с «<?xml version="1.0" encoding="UTF-8"?>
» и содержать только одно корневое дерево.
Итак, я попробовал написать awk-скрипт, который будет анализировать данные на отдельные куски и передавать их на xmllint, но я получаю сообщение об ошибке, с которым я не могу пройти. Я поставил скрипт и вывод ниже.
$ awk '
BEGIN {
RS = "]]>]]>"
xmlFormatCommand = "xmllint --format -"
}
{
print $0 | xmlFormatCommand
}
' SmallTest.xml
-:3: parser error : XML declaration allowed only at the start of the document
<?xml version="1.0" encoding="UTF-8"?>
^
-:4: parser error : Extra content at the end of the document
<data><lemur><type>"Ring-tailed"</type></lemur></data>
^
Если бы я сделать это в два отдельных операциях, одна где AWK печатает на три временные файлы, и один, где xmllint работает над этими файлами, то он работает.
E.g.
awk 'BEGIN {RS = "]]>]]>"} {print $0 > "Section_" NR ".txt" }' SmallTest.xml
В результате получается три файла Section_1.txt, Section_2.txt и Section_3.txt. Содержание Section_2.txt являются:
$ cat Section_2.txt
<?xml version="1.0" encoding="UTF-8"?>
<data><lemur><type>"Ring-tailed"</type></lemur></data>
я могу форматировать файл с xmllint:
$ cat Section_2.txt | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<data>
<lemur>
<type>"Ring-tailed"</type>
</lemur>
</data>
Так что я не понимаю, почему я не могу просто труба это xmllint в первую очередь в awk-скрипте.
Я ценю любую помощь, которую вы можете предоставить.
-Jon
я думаю, что форматирование объединённые файлы не будут работать из-за его структуры является недействительным. попробуйте удалить эти специальные charsequences']]> ', когда sed объединяет значения тегов данных, собранные из xmllint, используя встроенный xpath, создавая желаемую структуру, окружая теги выходных данных. надеюсь это поможет. –
Спасибо за комментарий. Я не думаю, что]]>]]> отправляется в xmllint, так как это разделитель записей. –