如何从命令行中打印XML?

svi*_*gen 490 xml unix command-line

相关:如何在(unix)shell脚本中打印JSON?

是否有(unix)shell脚本以人类可读的形式格式化XML?

基本上,我希望它改变以下内容:

<root><foo a="b">lorem</foo><bar value="ipsum" /></root>
Run Code Online (Sandbox Code Playgroud)

...进入这样的事情:

<root>
    <foo a="b">lorem</foo>
    <bar value="ipsum" />
</root>
Run Code Online (Sandbox Code Playgroud)

Gil*_*not 849

libxml2-utils

该实用程序附带libxml2-utils:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmllint --format -
Run Code Online (Sandbox Code Playgroud)

Perl的 XML::Twig

此命令附带XML :: Twig 模块,有时xml-twig-tools包:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xml_pp
Run Code Online (Sandbox Code Playgroud)

xmlstarlet

此命令附带xmlstarlet:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmlstarlet format --indent-tab
Run Code Online (Sandbox Code Playgroud)

tidy

检查tidy包裹:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    tidy -xml -i -
Run Code Online (Sandbox Code Playgroud)

蟒蛇

Python xml.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())'
Run Code Online (Sandbox Code Playgroud)

saxon-lint

你需要saxon-lint:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    saxon-lint --indent --xpath '/' -
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,“cat data.xml | xmllint --format - | tee data.xml”不起作用。在我的系统上,它有时适用于小文件,但总是会截断大文件。如果你真的想就地做任何事情,请阅读http://backreference.org/2011/01/29/in-place-editing-of-files/ (2认同)
  • 要解决 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()'&gt; 漂亮。 xml` (2认同)
  • 请注意,**tidy** 还可以**格式化没有根元素的 xml**。这对于通过管道格式化 xml 部分(例如从日志中提取)非常有用。`回显'&lt;x&gt;&lt;/x&gt;&lt;y&gt;&lt;/y&gt;' | 整洁-xml-iq` (2认同)

crm*_*cco 145

xmllint --format yourxmlfile.xml

xmllint是一个命令行XML工具,包含在libxml2(http://xmlsoft.org/)中.

================================================

注意:如果尚未libxml2安装,则可以通过执行以下操作来安装它:

CentOS的

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

Ubuntu的

sudo apt-get install libxml2-utils

Cygwin的

apt-cyg install libxml2

苹果系统

要使用Homebrew在MacOS上安装它,请执行以下操作: brew install libxml2

混帐

如果你想要代码,也可以在Git上使用: git clone git://git.gnome.org/libxml2

  • sputnick的答案包含这些信息,但crmpicco的答案是关于如何打印XML的一般问题的最有用的答案. (4认同)
  • 我们可以写出格式化的xml输出到其他一些xml文件并使用它...例如xmllint --format yourxmlfile.xml >> new-file.xml (2认同)
  • 在Ubuntu 16.04上,您可以使用以下命令:`sudo apt-get install libxml2-utils` (2认同)

mat*_*ter 37

您也可以使用整洁,可能需要先安装(例如在Ubuntu:sudo上apt-get install tidy).

为此,您将发出以下内容:

tidy -xml -i your-file.xml > output.xml
Run Code Online (Sandbox Code Playgroud)

注意:有许多额外的可读性标志,但是自动换行的行为有点烦人(http://tidy.sourceforge.net/docs/quickref.html).

  • 顺便说一句,这里有一些我认为有用的选项:`tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes <InFile .xml> OutFile.xml`. (9认同)
  • 伟大的提示@VictorYarema.我将它与pygmentize结合并将其添加到我的.bashrc:`alias prettyxml ='tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output -xml是| pygmentize -l xml'`然后可以`curl url | prettyxml` (2认同)

Dav*_*vid 13

您没有提到文件,因此我假设您要在命令行上提供XML字符串作为标准输入.在这种情况下,请执行以下操作:

$ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -
Run Code Online (Sandbox Code Playgroud)


gav*_*koa 7

xmllint支持就地格式化:

for f in *.xml; do xmllint -o $f --format $f; done
Run Code Online (Sandbox Code Playgroud)

正如Daniel Veillard所写:

我认为 xmllint -o tst.xml --format tst.xml 应该是安全的,因为解析器会在打开输出以将其序列化之前将输入完全加载到树中.

缩进级别由XMLLINT_INDENT环境变量控制,默认情况下为2个空格.示例如何将缩进更改为4个空格:

XMLLINT_INDENT='    '  xmllint -o out.xml --format in.xml
Run Code Online (Sandbox Code Playgroud)

--recover当XML文档被破坏时,您可能缺少选项.或者尝试使用严格的XML输出的弱HTML解析器:

xmllint --html --xmlout <in.xml >out.xml
Run Code Online (Sandbox Code Playgroud)

--nsclean,--nonet,--nocdata,--noblanks等可能是有用的.阅读手册页.

apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2
Run Code Online (Sandbox Code Playgroud)


jas*_*ard 5

没有在Mac上安装任何东西

使用 tidy

cat filename.xml | tidy -xml -iq

使用cat重定向查看文件以整洁地指定xml的文件类型,并在静默输出时缩进以抑制错误输出。JSON也可用于-json

  • 您不需要“cat”步骤:“tidy -xml -iq filename.xml”。此外,您甚至可以使用“-m”选项执行“tidy -xml -iq filename.xml”来*修改*原始文件... (3认同)