相关:如何在(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>

当前回答

Xmllint——格式化yourxmlfile.xml

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

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

注意:如果你没有安装libxml2,你可以通过以下方法安装它:

被久远

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

Ubuntu

Sudo apt-get安装libxml2-utils

Cygwin

Apt-cyg安装libxml2

操作系统

要在MacOS和Homebrew上安装此程序,请执行以下操作: 酿造安装libxml2

Git

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

其他回答

Xmllint支持就地格式化:

for f in *.xml; do xmllint -o $f --format $f; done

正如丹尼尔·维拉德所写:

我认为 Xmllint -o tst.xml——格式化tst.xml 当解析器将输入完全加载到树中时,应该是安全的吗 在打开输出序列化它之前。

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

XMLLINT_INDENT='    '  xmllint -o out.xml --format in.xml

当XML文档损坏时,您可能缺少——recover选项。或者尝试带有严格XML输出的弱HTML解析器:

xmllint --html --xmlout <in.xml >out.xml

——nclean,——nonet,——nocdata,——noblanks等可能有用。阅读手册页。

apt-get install libxml2-utils
dnf install libxml2
apt-cyg install libxml2
brew install libxml2

我花了很长时间才找到能在我的mac上运行的软件。以下是对我有效的方法:

brew install xmlformat
cat unformatted.html | xmlformat

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

xidel:

xidel -s input.xml -se . --output-node-format=xml --output-node-indent
<root>
  <foo a="b">lorem</foo>
  <bar value="ipsum"/>
</root>

或者file:write("output.xml",.,{"indent":true()})保存到文件中。