在属性之间添加换行符

bla*_*dri 4 xml linux command-line newline pretty-print

我有一个XML文档,该文档通过XSLT发送后,在XML属性之前不再有换行符。所以举个例子

<myoutertag one="a"
            two="b"
            three="c">
    <myinnertag four="d"
                five="e"/>
</myoutertag>
Run Code Online (Sandbox Code Playgroud)

会成为

<myoutertag one="a" two="b" three="c">
    <myinnertag four="d" five="e"/>
</myoutertag>
Run Code Online (Sandbox Code Playgroud)

这当然是完全有效的XML,但更难读取,特别是在有许多长属性值的情况下。根据我的阅读,XSLT无法保留这些换行符,因为XSLT处理器未传递此类不重要的信息。

因此,我现在正在寻找的是基于命令行的漂亮打印机(可在Linux中使用),理想情况下,它只会更改文档,因为它会在属性之间添加换行符。只要它更容易阅读,它是否在第一个属性之前添加一个就与我无关紧要。

到目前为止,我尝试失败的内容:

我正在使用输入文件

<?xml version="1.0" encoding="UTF-8"?>

<myoutertag one="a" two="b" three="c">
    <myinnertag four="d" five="e"/>
</myoutertag>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

因此,更改为:

  • 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>
Run Code Online (Sandbox Code Playgroud)

因此,没有缩进和奇怪的换行。

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>
Run Code Online (Sandbox Code Playgroud)

因此,如果我能在新属性的那些属性之前缩进一些符号,这基本上可以解决我的问题(我认为)。

还有其他建议吗?

bla*_*dri 5

好的,我找到了解决方案。我使用的工具称为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
Run Code Online (Sandbox Code Playgroud)

这些选项的含义在Tidy手册(或如果在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>
Run Code Online (Sandbox Code Playgroud)

现在我很高兴。:-)