相关:如何在(unix) shell脚本漂亮打印JSON ?
是否有(unix) shell脚本以人类可读的形式格式化XML ?
基本上,我想要它转换如下:
<root><foo a="b">lorem</foo><bar value="ipsum" /></root>
…变成这样:
<root>
<foo a="b">lorem</foo>
<bar value="ipsum" />
</root>
相关:如何在(unix) shell脚本漂亮打印JSON ?
是否有(unix) shell脚本以人类可读的形式格式化XML ?
基本上,我想要它转换如下:
<root><foo a="b">lorem</foo><bar value="ipsum" /></root>
…变成这样:
<root>
<foo a="b">lorem</foo>
<bar value="ipsum" />
</root>
当前回答
您没有提到文件,所以我假设您想在命令行上提供XML字符串作为标准输入。在这种情况下,请执行以下操作:
$ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -
其他回答
xmllint
这个实用程序附带libxml2-utils:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xmllint --format -
Perl的XML::树枝
这个命令附带了XML::Twig perl模块,有时是XML - Twig -tools包:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xml_pp
xmlstarlet
这个命令附带xmlstarlet:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xmlstarlet format --indent-tab
tidy
检查整齐的包装:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
tidy -xml -i -
Python
Python的XML .dom.minidom可以格式化XML(也适用于遗留的python2):
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
python -c 'import sys; import xml.dom.minidom; s=sys.stdin.read(); print(xml.dom.minidom.parseString(s).toprettyxml())'
saxon-lint
你需要撒克逊棉:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
saxon-lint --indent --xpath '/' -
saxon-HE
你需要saxon-HE:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
java -cp /usr/share/java/saxon/saxon9he.jar net.sf.saxon.Query \
-s:- -qs:/ '!indent=yes'
yq可以用来打印XML。 它有一个定义缩进的选项。
yq --input-format xml --output-format xml --indent 2
你也可以使用tidy,它可能需要先安装(例如在Ubuntu上:sudo apt-get install tidy)。
为此,您可以发布如下内容:
tidy -xml -i your-file.xml > output.xml
注意:有许多额外的可读性标志,但是换行行为有点烦人(http://tidy.sourceforge.net/docs/quickref.html)。
这个简单的解决方案不提供缩进,但对人眼来说要容易得多。此外,它还允许使用grep、head、awk等简单工具更容易地处理xml。
使用sed将'<'替换为前面有换行符的自身。
正如Gilles所提到的,在生产中使用它可能不是一个好主意。
# check you are getting more than one line out
sed 's/</\n</g' sample.xml | wc -l
# check the output looks generally ok
sed 's/</\n</g' sample.xml | head
# capture the pretty xml in a different file
sed 's/</\n</g' sample.xml > prettySample.xml
您没有提到文件,所以我假设您想在命令行上提供XML字符串作为标准输入。在这种情况下,请执行以下操作:
$ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -