有关: 如何在(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>
Answers:
libxml2-utils
该实用程序附带libxml2-utils
:
echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
xmllint --format -
Perl的 XML::Twig
该命令附带 XML :: Twig 佩尔模块,有时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 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())'
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'
echo '<xml .. />' | xmllint --some-read-from-stdn-option
?
libxml2-utils
在我美丽的Ubuntu中。
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
echo '<x></x><y></y>' | tidy -xml -iq
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
的Ubuntu
sudo apt-get install libxml2-utils
西格温
apt-cyg install libxml2
苹果系统
要使用Homebrew在MacOS上安装,只需执行以下操作:
brew install libxml2
吉特
如果需要代码,也可以在Git上使用:
git clone git://git.gnome.org/libxml2
sudo apt-get install libxml2-utils
git
Windows的下载甚至安装的最新版本xmllint
。示例:"C:\Program Files\Git\usr\bin\xmllint.exe" --format QCScaper.test@borland.com.cds.xml > QCScaper.test@borland.com.pretty-printed.cds.xml
您也可以使用tidy,它可能需要首先安装(例如,在Ubuntu上:sudo apt-get install tidy
)。
为此,您将发出如下内容:
tidy -xml -i your-file.xml > output.xml
注意:具有许多其他可读性标志,但是自动换行的行为有点令人讨厌,无法解开(http://tidy.sourceforge.net/docs/quickref.html)。
tidy
对我也很好 与不同hxnormalize
,此操作实际上会关闭<body>
标签。
tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml > OutFile.xml
。
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
for f in *.xml; do xmllint -o $f --format $f; done
正如Daniel Veillard所写:
我认为
xmllint -o tst.xml --format tst.xml
应该是安全的,因为解析器会将输入完全加载到树中,然后再打开输出以对其进行序列化。
缩进级别由XMLLINT_INDENT
环境变量控制,默认情况下为2个空格。示例如何将缩进更改为4个空格:
XMLLINT_INDENT=' ' xmllint -o out.xml --format in.xml
--recover
XML文档损坏时,可能缺少选项。或者尝试使用具有严格XML输出的弱HTML解析器:
xmllint --html --xmlout <in.xml >out.xml
--nsclean
,--nonet
,--nocdata
,--noblanks
等可能是有用的。阅读手册页。
apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2
我想添加一个纯Bash解决方案,因为手动操作并不困难,有时您不想安装额外的工具来完成这项工作。
#!/bin/bash
declare -i currentIndent=0
declare -i nextIncrement=0
while read -r line ; do
currentIndent+=$nextIncrement
nextIncrement=0
if [[ "$line" == "</"* ]]; then # line contains a closer, just decrease the indent
currentIndent+=-1
else
dirtyStartTag="${line%%>*}"
dirtyTagName="${dirtyStartTag%% *}"
tagName="${dirtyTagName//</}"
# increase indent unless line contains closing tag or closes itself
if [[ ! "$line" =~ "</$tagName>" && ! "$line" == *"/>" ]]; then
nextIncrement+=1
fi
fi
# print with indent
printf "%*s%s" $(( $currentIndent * 2 )) # print spaces for the indent count
echo $line
done <<< "$(cat - | sed 's/></>\n</g')" # separate >< with a newline
将其粘贴到脚本文件中,并以xml形式传送。假设xml都在一行上,并且任何地方都没有多余的空格。一个人可以很容易地\s*
在正则表达式中添加一些额外的东西来解决该问题。
xmllint
在Debian系统上可用,您需要安装软件包libxml2-utils
(libxml2
不提供此工具,至少在Debian 5.0“ Lenny”和6.0“ Squeeze”上不提供)。