【问题标题】:Adding line breaks between attributes在属性之间添加换行符
【发布时间】: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.xmlcat 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 偏角后的换行符消失了
  • &lt;myinnertag&gt; 的缩进从四个空格减少到两个空格

我不想要这些更改。这是使用 libxml 版本 20706。

xml_pp -s

我尝试了nonensgmlsniceindentedrecordrecord_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


【解决方案1】:

好的,我找到了解决方案。我使用的工具叫做HTML Tidy(实际上我使用了jTidy,它是HTML Tidy 到Java 的一个端口,因此是可移植的)。该工具提供了许多配置选项;我要找的那个叫indent-attributes: true。其实我整个配置文件是:

add-xml-decl: true
drop-empty-paras: false
fix-backslash: false
fix-bad-comments: false
fix-uri: false
input-xml: true
join-styles: false
literal-attributes: true
lower-literals: false
output-xml: true
preserve-entities: true
quote-ampersand: false
quote-marks: false
quote-nbsp: false

indent: auto
indent-attributes: true
indent-spaces: 4
tab-size: 4
vertical-space: true
wrap: 150

char-encoding: utf8
input-encoding: utf8
newline: CRLF
output-encoding: utf8

quiet: true

这些选项的含义在Tidy manual(或者如果你在 Linux 系统上安装它的手册页)中进行了解释,我最关心的是我可以设置缩进设置的中间块。

我现在可以使用命令java -jar jtidy-r938.jar -config tidy.config test.xml 调用该工具,输出将是

<?xml
  version="1.0"
  encoding="UTF-8"?>
<myoutertag
 one="a"
 two="b"
 three="c">
    <myinnertag
     four="d"
     five="e" />
</myoutertag>

现在我很高兴。 :-)

【讨论】:

  • 我对比了jTidy(最新的git版本)和tidy,发现后者现在有更多的选择。最重要的是(根据我的需要),它有 --sort-attributes 选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多