我想使用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
基本上,标签指定新句子的开头,并指定我想用它重建的单词。我有很多这样的句子。有什么建议?我在考虑在python中使用sed或re class,但我无法想出解决方案。谢谢!
答案 0 :(得分: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
OP中的原始XML被破坏,不允许属性以数字开头。
lxml
将被安装,它不是Python stdlib的一部分。但是,它提供了许多实用的功能
functins(更好的XPath,对模式的验证......),值得安装(我考虑一下)
我的Python环境的lxml
标准部分。)
etree.parse
能够解析文件类对象或作为参数传递的文件内容。
.xpath("//Words")
是将句子分成不同群体的必要条件。word.xpath(".//Z/text()")
处的点很重要,它指示XPath评估表达式
相对于当前元素。答案 1 :(得分: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
的工作原理。