相关:如何在(unix)shell脚本中漂亮地打印JSON?
是否有一个(unix)shell脚本以人类可读的形式格式化XML?
基本上,我希望它转换以下内容:
1
| <root><foo a="b">lorem</foo><bar value="ipsum" /></root> |
…变成这样:
1 2 3 4
| <root>
<foo a="b">lorem</foo>
<bar value="ipsum" />
</root> |
- 要使xmllint在debian系统上可用,您需要安装包libxml2-utils(libxml2不提供此工具,至少在debian 5.0"lenny"和6.0"squesh"上不提供)。
libxml2-utils
此实用程序随libxml2-utils一起提供:
1 2
| echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xmllint --format - |
Perl的XML::Twig。
此命令随xml::twig perl模块一起提供,有时是xml-twig-tools包:
1 2
| echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xml_pp |
xmlstarlet
此命令随xmlstarlet一起提供:
1 2
| echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xmlstarlet format --indent-tab |
tidy
检查tidy包:
1 2
| echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
tidy -xml -i - |
Python
python的xml.dom.minidom可以格式化xml(python2和python3两种格式):
1 2
| 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:
1 2
| echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
saxon-lint --indent --xpath '/' - |
saxon-HE
您需要saxon-HE:
1 2 3
| 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 '' | xmllint --some-read-from-stdn-option?
- 查看我编辑的帖子
- 包裹在我漂亮的Ubuntu里。
- 你知道怎么包长线吗?
- 对于xml_pp选项:可以从存储库xml-twig-tools安装(ubuntu)
- @戴维格:埃多克斯1〔4〕。
- 请注意,"cat data.xml xmllint--format-tee data.xml"不起作用。在我的系统中,它有时适用于小文件,但总是截断大文件。如果你真的想做任何事情,请阅读backreference.org/2011/01/29/in-place-editing-of-files。
- @sputnick这是一个很好的答案,但是你似乎一直在编辑它来尝试去撞它……让它来吧!
- @我尽量做到最全面。
- @sputnick是的,我很感激,但最后一对夫妇一直在添加一个词,或者把东西从上到下移动…
- 我这样做是为了使用xmlint:find . -name"*.xml" -exec xmllint --format --output {} {} \;,您必须为它指定一个文件,将漂亮的打印结果放入其中。在我的例子中,我只是想更新文件,所以输出文件是作为输入的Sameone。
- 要在python版本中解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 805: ordinal not in range(128),您需要定义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。
- 如果行太长,xmllint似乎会默默地拒绝进行任何格式化。
- 看起来整洁是将属性放在单独的行上的唯一选择。
- stackoverflow.com/questions/9942594/&hellip;显示了管道到文件时python中Unicode错误的另一个修复方法。
xmllint --format yourxmlfile.xml
xmllint是一个命令行XML工具,包含在libxml2中(http://xmlsoft.org/)。
=====================================
注意:如果您没有安装libxml2,可以通过执行以下操作进行安装:
CITOS
1 2 3 4 5 6 7 8
| cd /tmp
wget ftp://xmlsoft.org/libxml2/libxml2-2.8.0.tar.gz
tar xzf libxml2-2.8.0.tar.gz
cd libxml2-2.8.0/
./configure
make
sudo make install
cd |
乌邦图
sudo apt-get install libxml2-utils
赛文
apt-cyg install libxml2
马科斯
要在带有自制的MacOS上安装此程序,请执行以下操作:brew install libxml2
吉特
如果您需要代码,也可以在Git上找到:git clone git://git.gnome.org/libxml2
- sputnick的答案包含了这些信息,但是crmpicco的答案是关于如何漂亮地打印XML的一般问题的最有用的答案。
- 我们可以将格式化的XML输出写出到其他XML文件中,并使用它。例如xmllint--格式化yourxmlfile.xml>>new-file.xml
- 在Ubuntu 16.04上,您可以使用以下命令:sudo apt-get install libxml2-utils。
- 这也适用于Windows;用于Windows下载的git甚至安装了最新版本的xmllint。示例:"C:\Program Files\Git\usr\bin\xmllint.exe" --format [email protected] > [email protected]。
您也可以使用Tidy,这可能需要先安装(例如在Ubuntu:sudo apt-get install tidy上)。
为此,您将发布如下内容:
1
| tidy -xml -i your-file.xml > output.xml |
注意:有许多附加的可读性标志,但是换行行为对于解开(http://tidy.sourceforge.net/docs/quickref.html)有点烦人。
- 很有用,因为我无法让xmlint将换行符添加到单行XML文件中。谢谢!
- tidy对我来说也很好。与hxnormalize不同,这个操作实际上关闭了标记。
- 顺便说一句,这里有一些我认为有用的选择:tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml > OutFile.xml。
- 伟大的提示@维克多亚雷马。我把它和Pygmentize结合起来,添加到我的.bashrc中:alias prettyxml='tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes | pygmentize -l xml',然后可以curl url | prettyxml。
您没有提到文件,所以我假设您希望在命令行中提供XML字符串作为标准输入。在这种情况下,请执行以下操作:
1
| $ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format - |
xmllint支持就地格式化:
1
| for f in *.xml; do xmllint -o $f --format $f; done |
正如丹尼尔·韦拉德所写:
I think
xmllint -o tst.xml --format tst.xml
should be safe as the parser will fully load the input into a tree
before opening the output to serialize it.
缩进级别由XMLLINT_INDENT环境变量控制,默认为2个空格。示例如何将缩进更改为4个空格:
1
| XMLLINT_INDENT=' ' xmllint -o out.xml --format in.xml |
当XML文档被破坏时,您可能缺少--recover选项。或者尝试使用带有严格XML输出的弱HTML解析器:
1
| xmllint --html --xmlout <in.xml >out.xml |
可以使用--nsclean、--nonet、--nocdata、--noblanks等。读人页。
1 2 3
| apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2 |