两个XML标签之间的文本
我想用shell或者python命令来获取两个xml标签之间的文本。比如输入:
<Name input="sentence">
<Words>
<Z 2="x">I</Z>
<Z 2="x">like</Z>
<Z 2="x">to</Z>
<Z 2="x">eat</Z>
<Z 2="x">food</Z>
</Words>
</Name>
<Name input="sentence">
<Words>
<Z 2="x">Sam's</Z>
<Z 2="x">food</Z>
<Z 2="x">is</Z>
<Z 2="x">best</Z>
</Words>
</Name>
我希望输出是:
I like to eat food
Sam's food best
基本上,
2 个回答
0
这里有一个简单的例子,使用的是 xml.etree.ElementTree
库,详细信息可以查看这个链接:https://docs.python.org/2/library/xml.etree.elementtree.html#
输入文件是 inputxml.xml
<?xml version="1.0"?>
<Name input="sentence">
<Words>
<Z>I</Z>
<Z>like</Z>
<Z>to</Z>
<Z>eat</Z>
<Z>food</Z>
</Words>
</Name>
这个程序文件叫做 XMLParseWords.py
import xml.etree.ElementTree as ET
XML_file = 'inputxml.xml'
tree = ET.parse(XML_file)
root = tree.getroot()
outputString = ""
for word in root.findall('./Words/Z'):
outputString += word.text + " "
print outputString
当你运行这个程序时,它会输出 I like to eat food
。只要你了解你正在解析的 XML 文件的结构,提取你需要的元素应该是比较简单的。我建议你先阅读我之前提到的 pydoc,这样可以帮助你理解 xml.etree.ElementTree
是怎么工作的。
3
使用 lxml
的 XPath
我们已经修正了文件 "xmldoc.xml" 中的 XML 文档:
<?xml version="1.0"?>
<root>
<Name input="sentence">
<Words>
<Z>I</Z>
<Z>like</Z>
<Z>to</Z>
<Z>eat</Z>
<Z>food</Z>
</Words>
</Name>
<Name input="sentence">
<Words>
<Z>Sam's</Z>
<Z>food</Z>
<Z>is</Z>
<Z>best</Z>
</Words>
</Name>
</root>
现在我们可以在解析后的文档上使用 xpath
:
>>> from lxml import etree
>>> for word in etree.parse("xmldoc.xml").xpath("//Words"):
... print " ".join(word.xpath(".//Z/text()"))
...
I like to eat food
Sam's food is best
评论
原始的 XML 在提问者那里是有问题的,属性名不能以数字开头。
lxml
需要单独安装,它不是 Python 自带的库。不过,它提供了很多实用的功能(比如更好的 XPath 支持、可以根据模式进行验证等),所以安装它是值得的。我把lxml
视为我 Python 环境中的标准部分。etree.parse
可以解析文件类型的对象或者作为参数传入的文件内容。.xpath("//Words")
是必要的,它可以将句子分成不同的组。- 在
word.xpath(".//Z/text()")
中的点是很重要的,它告诉 XPath 要相对于当前元素来评估这个表达式。