我有一个包含大量配置数据的“类 XML”文件。我说“类似 XML”是因为它实际上就像 3 个 XML 文件连接在一起,用“]]>]]>”分隔
例如
<?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 对这些文件进行操作,那么它可以工作。
例如
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>
所以我不明白为什么我不能首先在 awk 脚本中将它通过管道传输到 xmllint 。
感谢您提供的任何帮助。
-乔恩