相关:如何在(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>
libxml2-utils
该实用程序附带libxml2-utils
:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xmllint --format -
Perl的 XML::Twig
该命令附带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
检查tidy
包装:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
tidy -xml -i -
Python
Pythonxml.dom.minidom
可以格式化XML(python2和python3):
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
你需要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'
好,快速的答案。第一种选择似乎在现代* nix安装中将更加普遍。次要点;但是可以不通过中间文件来调用它吗?即,
echo '<xml .. />' | xmllint --some-read-from-stdn-option
?包
libxml2-utils
在我美丽的ubuntu中。请注意,“ cat data.xml | xmllint --format-| tee data.xml”不起作用。在我的系统上,它有时适用于小文件,但始终会截断大文件。如果您真的想做任何事情,请阅读backreference.org/2011/01/29/in-place-editing-of-files
要
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 805: ordinal not in range(128)
在python版本中解决,您需要定义PYTHONIOENCODING="UTF-8"
:cat some.xml | PYTHONIOENCODING="UTF-8" python -c 'import sys;import xml.dom.minidom;s=sys.stdin.read();print xml.dom.minidom.parseString(s).toprettyxml()' > pretty.xml
注意,tidy还可以格式化不带root元素的xml。这对于通过管道,xml节(例如,从日志中提取)进行格式化很有用。
echo '<x></x><y></y>' | tidy -xml -iq