如何使用shellscript解析XML?

Spr*_*dzy 60 linux bash shell

我想知道使用shellscript解析XML文件的最佳方法是什么?

  • 一个人应该手工做吗?
  • 第三层库是否存在?

如果你已经成功了,如果你能让我知道你是怎么做到的

Joe*_*oel 77

你可以试试xmllint

xmllint程序解析一个或多个XML文件,在命令行中指定为xmlfile.它根据所选的选项打印各种类型的输出.它对于检测XML代码和XML解析器中的错误非常有用

它允许您使用--pattern选项通过xpath选择XML doc中的元素.

在Mac OS X(Yosemite)上,默认安装它.
在Ubuntu上,如果尚未安装,则可以运行apt-get install libxml2-utils

  • 您如何使用--pattern? (2认同)

aes*_*ede 22

这是一个完整的工作示例.
如果它只提取电子邮件地址,你可以执行以下操作:
1)假设XML文件spam.xml就像

<spam>
<victims>
  <victim>
    <name>The Pope</name>
    <email>pope@vatican.gob.va</email>
    <is_satan>0</is_satan>
  </victim>
  <victim>
    <name>George Bush</name>
    <email>father@nwo.com</email>
    <is_satan>1</is_satan>
  </victim>
  <victim>
    <name>George Bush Jr</name>
    <email>son@nwo.com</email>
    <is_satan>0</is_satan>
  </victim>
</victims>
</spam>
Run Code Online (Sandbox Code Playgroud)

2)您可以使用以下简短的bash代码获取电子邮件并进行处理:

#!/bin/bash
emails=($(grep -oP '(?<=email>)[^<]+' "/my_path/spam.xml"))

for i in ${!emails[*]}
do
  echo "$i" "${emails[$i]}"
  # instead of echo use the values to send emails, etc
done
Run Code Online (Sandbox Code Playgroud)

这个例子的结果是:

0 pope@vatican.gob.va
1 father@nwo.com
2 son@nwo.com
Run Code Online (Sandbox Code Playgroud)

重要提示:
请勿将此用于严重事项.这对于玩游戏,获得快速结果,学习grep等都是可以的,但是你一定要寻找,学习和使用XML解析器进行制作(参见下面的Micha评论).

  • 嗨,`-o`或`--only-matching`意味着"只显示匹配的部分",在这种情况下是电子邮件.`-P`或`--perl-regexp`的意思是"使用正则表达式,就像它是Perl一样".您可以通过在命令行中执行`grep --help`来查看此选项和所有其他选项.你也可以为`man grep`做完整的手册. (2认同)
  • 还值得注意的是,这是一种从 XML 文档获取电子邮件的快速而肮脏的方式。您可以在命令行中获得相同的结果:`for email in $(cat /my_path/spam.xml | grep -oP '(?&lt;=email&gt;)[^&lt;]+'); 做 echo "$email"; done` 如果你打算将它用于生产,你应该**定义**使用 XML 解析器。就我而言,我将 Python 脚本与 [lxml](http://lxml.de/) 一起使用 (2认同)
  • 你为什么使用grep?您不得使用正则表达式来解析 xml:/sf/ask/121264391/ (2认同)
  • 是的,@ MichaWiedenmann的帖子很经典,任何人都必须阅读!请注意,我不建议将我的解决方案用于生产环境,而只是建议您使用命令行处理快速而肮脏的事情。您应该始终将XML解析器用于现实生活。 (2认同)

小智 11

还有xmlstarlet(也适用于Windows).

http://xmlstar.sourceforge.net/doc/xmlstarlet.txt


小智 10

我很惊讶没人提到xmlsh.使命宣言:

XML的命令行shell基于Unix Shell的原理和设计

xmlsh提供了一个熟悉的脚本环境,但专门为脚本xml进程量身定制.

这里提供类似shell的命令列表.

我使用xed了很多相当于sedXML 的命令,并允许XPath基于搜索和替换.


Kei*_*ith 9

尝试sgrep.目前尚不清楚你想要做什么,但我肯定不会尝试在bash中编写XML解析器.

  • 听到,我写了一个"解析器"(我不会真的称它为解析器,虽然它工作得很好)对于使用sed/awk的JSON,这是一场噩梦. (3认同)

fra*_*nkc 7

你有安装xml_grep吗?它是某些发行版上基于perl的实用程序标准(它已预先安装在我的CentOS系统上).而不是给它一个正则表达式,你给它一个xpath表达式.


小智 5

一个相当新的项目是 xml-coreutils 包,它具有 xml-cat、xml-cp、xml-cut、xml-grep、...

http://xml-coreutils.sourceforge.net/contents.html