相关:如何在(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>
当前回答
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
其他回答
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
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'
我想:
nicholas@mordor:~/flwor$
nicholas@mordor:~/flwor$ cat ugly.xml
<root><foo a="b">lorem</foo><bar value="ipsum" /></root>
nicholas@mordor:~/flwor$
nicholas@mordor:~/flwor$ basex
BaseX 9.0.1 [Standalone]
Try 'help' to get more information.
>
> create database pretty
Database 'pretty' created in 231.32 ms.
>
> open pretty
Database 'pretty' was opened in 0.05 ms.
>
> set parser xml
PARSER: xml
>
> add ugly.xml
Resource(s) added in 161.88 ms.
>
> xquery .
<root>
<foo a="b">lorem</foo>
<bar value="ipsum"/>
</root>
Query executed in 179.04 ms.
>
> exit
Have fun.
nicholas@mordor:~/flwor$
如果只是因为它“在”数据库中,而不“只是”一个文件。在我看来,更容易处理。
相信别人已经解决了这个问题。如果您愿意,毫无疑问eXist在格式化xml方面可能“更好”,或者同样好。
当然,您总是可以以各种不同的方式查询数据。我尽量让它简单。您也可以只使用GUI,但您指定了控制台。
无需在macOS /大多数Unix上安装任何东西。
使用整洁
Cat filename.xml | tidy -xml -iq .xml
使用cat重定向查看文件,指定xml文件类型为tidy,并在安静输出时缩进,将抑制错误输出。JSON也可以使用-json。
你也可以使用tidy,它可能需要先安装(例如在Ubuntu上:sudo apt-get install tidy)。
为此,您可以发布如下内容:
tidy -xml -i your-file.xml > output.xml
注意:有许多额外的可读性标志,但是换行行为有点烦人(http://tidy.sourceforge.net/docs/quickref.html)。