在属性之间添加换行符

时间:2014-08-22 12:25:22

标签: xml linux command-line newline pretty-print

我有一个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 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

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

所以,如果我能够在新行中的那些属性之前更多地缩进,这基本上可以解决我的问题(我认为)。

还有其他建议吗?

1 个答案:

答案 0 :(得分:4)

好的,我找到了解决方案。我使用的工具称为HTML Tidy(实际上,我使用了jTidy,这是一个HTML Tidy to 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>

现在我很高兴。 : - )