【发布时间】:2014-10-16 07:22:18
【问题描述】:
我有一个 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 --格式
我尝试了xmllint --format test.xml 和cat test.xml | xmllint --format -,结果相同:
<?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 -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>
所以,如果我能让它在新行中的那些属性之前再缩进一些,那基本上可以解决我的问题(我认为)。
还有什么建议吗?
【问题讨论】:
-
这个 StackOverflow 问题的最佳答案是否符合您的要求? stackoverflow.com/questions/16090869/…
-
@DWRoelands 不,xmllint 不添加那些换行符,我在问这里之前尝试过。
-
@DWRoelands 据我所知, xml_pp 只提供预定义的样式,没有一个只会改变这一点。还是我错过了什么?
-
我同意@DWRoelands 最初的评论。我跑了 cat
file.xml | xmllint --format -并得到了你想要的。
标签: xml linux command-line newline pretty-print