在属性之间添加换行符

8

我有一个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.xmlcat 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, recordrecord_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>

所以,如果我能让它在新行中缩进更多这些属性,那基本上就解决了我的问题(我想)。

还有其他建议吗?


这个 StackOverflow 问题的最佳答案是否符合您的要求?https://dev59.com/mWQo5IYBdhLWcg3wZelg - DWRoelands
@DWRoelands 不,xmllint不会添加这些换行符,我在问这里之前就尝试过了。 - blalasaadri
我同意@DWRoelands的最初评论。我运行了cat file.xml | xmllint --format -,并获得了您想要的结果。 - Emilien
@Emilen 我再次检查了一下,对我来说还是不起作用。请查看编辑后的问题以获取更多信息。 - blalasaadri
据我所知,在任何常用的表示中,属性之间的空格不是 XML 数据模型的一部分。XML 规范中没有要求将其传递到应用程序中。 - biziclop
显示剩余6条评论
1个回答

10

好的,我找到了解决方案。我用的工具叫做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手册中有解释(如果你在Linux系统上安装了它,则在man页中有解释)。我主要关心中间部分,可以设置缩进设置。

现在我可以使用命令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>

现在我很开心。 :-)


1
我比较了jTidy(最新的git版本)和tidy,发现后者现在有更多的选项。最重要的是(对于我的需求),它有“--sort-attributes”选项。 - hoijui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接