Python:在一个节点中解析具有多个属性的XML文件

时间:2016-11-03 12:34:41

标签: python xml xpath elementtree

我还是编程新手,但我知道一些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]

目前我只是想知道它是否可能。到目前为止,我只是设法通过属性结构撞到墙上,更不用说空值了。

2 个答案:

答案 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元素的列表,然后返回每个结构的所有属性。