![打印两个 XML 标签之间的文本](https://linux22.com/image/834774/%E6%89%93%E5%8D%B0%E4%B8%A4%E4%B8%AA%20XML%20%E6%A0%87%E7%AD%BE%E4%B9%8B%E9%97%B4%E7%9A%84%E6%96%87%E6%9C%AC.png)
请考虑以下来自大型 XML 文件的摘录:
...
<serverName someKey="false" anotherKey="0.05" thirdKey="0.04">
<default>blah.blah.blah</default>
<region name="US">us.blah.net</region>
<region name="EU">eu.blah.net</region>
<region name="IL">il.blah.net</region>
</serverName>
...
<serverName ...>
如何打印开始标签和结束标签之间的行</serverName>
?
答案1
sed
是一个很棒的工具,但 XML 最终会让任何使用 REGEX 的程序员哭泣。我知道。我经历过。如果您的数据有哪怕最小的可能性发生变化,您都需要一个合适的 XML 解析器。
我的选择是使用 BeautifulSoup,但它使得直接从 Bash 处理它变得相当困难。如果你想编写一个中间 Python 脚本,这仍然是一个选择……否则xpath
是一个相当经典的选择。它是 Perl 的 libxml 库的包装器,它可以做一些相当强大的事情。
sudo apt-get install libxml-xpath-perl
举个例子,我是这样做的xpath 查询语言:
xpath -e '*/serverName/*' big_xml_file.xml
再次,如果您需要使用此 XML 执行任何有用的操作,请考虑使用更强大的工具,例如 BeautifulSoup 和 Python。
答案2
sed -n '/<serverName/,/<\/serverName/p' big_xml_file.xml
成功了(改编自这个帖子在 linuxquestions.org)。
在 Ubuntu 14.04 上:
$ sed -n '/<serverName/,/<\/serverName/p' big.xml
<serverName someKey="false" anotherKey="0.05" thirdKey="0.04">
<default>blah.blah.blah</default>
<region name="US">us.blah.net</region>
<region name="EU">eu.blah.net</region>
<region name="IL">il.blah.net</region>
</serverName>
答案3
我还可以想象您需要根据某些给定的条件路径从更长的列表中找到特定的服务器以及特定的设置或区域。
在这种情况下,我建议将 XPATH 语句和条件包装在 XSLT 样式表中。存储库中有许多 XSLT 解析器可用于命令行、PHP、Perl、Python、Java 等。
XSLT功能很强大,可以输出文本,xml,html。