我有一个XML文档,通过XSLT处理后,XML属性前不再有换行符。例如:
<myoutertag one="a"
two="b"
three="c">
<myinnertag four="d"
five="e"/>
</myoutertag>
将会变成
<myoutertag one="a" two="b" three="c">
<myinnertag four="d" five="e"/>
</myoutertag>
这当然是有效的XML,但阅读起来更加困难,特别是如果有许多较长的属性值。据我所知,XSLT无法保留这些换行符,因为XSLT处理器没有传递这种不重要的信息。
所以,现在我正在寻找一个基于命令行的漂亮打印机(可在Linux中使用),它最好只改变文档,即在属性之间添加换行符。它是否在第一个属性之前添加一个属性并不重要,只要它更容易阅读即可。
到目前为止,我尝试过但未成功的方法:
我正在使用输入文件
<?xml version="1.0" encoding="UTF-8"?>
<myoutertag one="a" two="b" three="c">
<myinnertag four="d" five="e"/>
</myoutertag>
xmllint --format
我尝试了xmllint --format test.xml
和cat test.xml | xmllint --format -
,结果相同:
这个命令可以将XML文件格式化为易读的形式。
<?xml version="1.0" encoding="UTF-8"?>
<myoutertag one="a" two="b" three="c">
<myinnertag four="d" five="e"/>
</myoutertag>
所以,更改如下:
- xml声明后的换行符已经被删除
<myinnertag>
缩进从四个空格减少到两个空格
我不想要这些更改。使用的是libxml版本20706。
xml_pp-s
我尝试了none
, nsgmls
, nice
, indented
, record
和 record_c
这些样式。唯一接近的是nsgmls
,它会添加换行符,但结果看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<myoutertag
one="a"
two="b"
three="c"
><myinnertag
four="d"
five="e"
/></myoutertag>
因此,不要缩进和奇怪的换行。
xmlstarlet
xmlstarter fo test.xml
的输出与 xmllint
相同。我还尝试过类似 xmlstarter -ed -P --insert "//@*" -t text -n "" -v "\\n" test.xml
这样的命令,但结果导致 glibc 指针错误。我猜这并不意外,因为我试图在属性之间添加文本。
tidy
到目前为止,这是我最接近的结果了。运行命令 tidy -quiet -xml -indent -wrap 1 test.xml
给出的结果是:
<?xml version="1.0"
encoding="UTF-8"?>
<myoutertag one="a"
two="b"
three="c">
<myinnertag four="d"
five="e"/>
</myoutertag>
所以,如果我能让它在新行中缩进更多这些属性,那基本上就解决了我的问题(我想)。
还有其他建议吗?
file.xml | xmllint --format -
,并获得了您想要的结果。 - Emilien