我还是编程新手,但我知道一些Python并且熟悉XPath和XML。目前我正在使用一些看起来像这样的XML数据:
<foo>
<bar>
<unit>
<structure>
<token word="Rocky" att1="noun" att2="name">Rocky</token>
<token word="the" att1="article" att2="">the</token>
<token word="yellow" att1="adjective" att2="color">yellow</token>
<token word="dog" att1="noun" att2="animal">dog</token>
</structure>
</unit>
</bar>
</foo>
现在我需要做的是首先找到一个属性值,让我们来看
<token word="dog" att1="noun"att2="animal"</token>
表示实例。因此,在文档的所有结构中,我想首先找到所有动物的节点作为 att2 值,然后将该节点的所有兄弟节点都放入列表中。因为每个节点都有几个属性,我试图将它们中的每一个都包含在一个不同的列表中,也就是说,在结构中包含 animal 的所有属性中列出一个列表。其中一个孩子的 att2 值。例如:
listWord = [Rocky, the, yellow, dog]
listAtt1 = [noun, article, adjective, noun]
listAtt2 = [name, ,color, animal]
目前我只是想知道它是否可能。到目前为止,我只是设法通过属性结构撞到墙上,更不用说空值了。
答案 0 :(得分:1)
我不确定我理解你的问题,但这是我理解的部分(使用lxml和xpath):
from lxml import etree
tree = etree.fromstring("""<foo>
<bar>
<unit>
<structure>
<token word="Rocky" att1="noun" att2="name"></token>
<token word="the" att1="article" att2=""></token>
<token word="yellow" att1="adjective" att2="color"></token>
<token word="dog" att1="noun" att2="animal"></token>
</structure>
</unit>
</bar>
</foo>""")
// get a list of all possible words, att1, att2:
listWord = tree.xpath("//token/@word")
listAtt1 = tree.xpath("//token/@att1")
listAtt2 = tree.xpath("//token/@att2")
// get all the tokens with att2="animal"
for token in tree.xpath('//token[@att2="animal"]'):
do_your_own_stuff()
答案 1 :(得分:0)
包含结束标记标记,并假设您的文字包含在test.xml
中,以下内容:
import xml.etree.ElementTree
e = xml.etree.ElementTree.parse('test.xml').getroot()
listWord = []
listAtt1 = []
listAtt2 = []
for child in e.iter('token'):
listWord.append(child.attrib['word'])
listAtt1.append(child.attrib['att1'])
listAtt2.append(child.attrib['att2'])
print listWord
print listAtt1
print listAtt2
将返回:
['Rocky', 'the', 'yellow', 'dog']
['noun', 'article', 'adjective', 'noun']
['name', '', 'color', 'animal']
e.iter()
允许您遍历e
作为根和它下面的元素 - 我们指定token
的标记只返回token
个元素。 child.attrib
返回属性字典,我们将其附加到列表中。
编辑:对于你问题的第二点,我认为以下内容(尽管可能不是最佳做法)会做你想要的:
import xml.etree.ElementTree
e = xml.etree.ElementTree.parse('test.xml').getroot()
listWord = []
listAtt1 = []
listAtt2 = []
animal_structs =[]
for structure in e.iter('structure'):
for child in structure.iter('token'):
if 'att2' in child.keys():
if child.attrib['att2'] == 'animal':
animal_structs.append(structure)
break
for structure in animal_structs:
for child in structure.iter('token'):
listWord.append(child.attrib['word'])
listAtt1.append(child.attrib['att1'])
listAtt2.append(child.attrib['att2'])
print listWord
print listAtt1
print listAtt2
我们首先创建一个包含structure
子元素的所有animal
元素的列表,然后返回每个结构的所有属性。