1

使用 xml.etree(请使用此模块)

我该如何解析:

<?xml version="1.0" encoding="UTF-8"?>
<EntityPath="c:\a.zip" Name="a.zip" >
   <WorkfileDescription>something</WorkfileDescription>
   <Revision EntityPath="c:\a.zip" Name="1.1" Author="me">
      <ChangeDescription>Some comentary</ChangeDescription>
      <PGROUP Name="A" />
      <PGROUP Name="B" />
      <PGROUP Name="C" />
      <Label Name="SOFTWARE" />
      <Label Name="READY" />
   </Revision>
   <Revision EntityPath="c:\a.zip" Name="1.0" Author="me">
      <ChangeDescription>Some comentary</ChangeDescription>
      <PGROUP Name="A" />
      <Label Name="GAME" />
      <Label Name="READY" />
   </Revision>
</VersionedFile>

为了得到:

Revision: a.zip
Name: 1.1
Author: me
ChangeDescription: Some comentary
PGROUP: A
PGROUP: B
PGROUP: C
Label: SOFTWARE
Label: READY

Revision: a.zip
Name: 1.0
Author: me
ChangeDescription: Some comentary
PGROUP: A
Label: GAME
Label: READY

到目前为止,使用以下代码我只能获得 Revision 行,但我正在努力解析其他子字段:

from xml.etree import ElementTree
try:
    tree = ElementTree.parse(self.xml)
    root = tree.getroot()
    info_list = []
    for child in root:
        print(child.tag,child.attrib)


except Exception:
    raise
finally:
    self.xml = None
4

2 回答 2

2

查找所有Revision标签,从 打印所有属性element.attrib,遍历Revision元素以获取子元素和Name属性值:

import xml.etree.ElementTree as etree


data = """<?xml version="1.0" encoding="UTF-8"?>
<VersionedFile EntityPath="c:\\a.zip" Name="VfOMP_CRM.zip">
   <WorkfileDescription>something</WorkfileDescription>
   <Revision EntityPath="c:\\a.zip" Name="1.1" Author="me">
      <ChangeDescription>Some comentary</ChangeDescription>
      <PGROUP Name="A" />
      <PGROUP Name="B" />
      <PGROUP Name="C" />
      <Label Name="SOFTWARE" />
      <Label Name="READY" />
   </Revision>
   <Revision EntityPath="c:\\a.zip" Name="1.0" Author="me">
      <ChangeDescription>Some comentary</ChangeDescription>
      <PGROUP Name="A" />
      <Label Name="GAME" />
      <Label Name="READY" />
   </Revision>
</VersionedFile>
"""

tree = etree.fromstring(data)
for revision in tree.findall('Revision'):
    for key, value in revision.attrib.iteritems():
        print "%s: %s" % (key, value)

    for child in revision:
        print "%s: %s" % (child.tag, child.attrib.get('Name', ''))

    print

印刷:

Name: 1.1
EntityPath: c:\a.zip
Author: me
ChangeDescription: 
PGROUP: A
PGROUP: B
PGROUP: C
Label: SOFTWARE
Label: READY

Name: 1.0
EntityPath: c:\a.zip
Author: me
ChangeDescription: 
PGROUP: A
Label: GAME
Label: READY

您可能需要稍微调整一下以获得所需的输出,但这应该会给您基本的想法。

于 2014-05-02T15:38:31.980 回答
0

基于 alecxe 解决方案,我能够使用它:

    from xml.etree import ElementTree
    try:
        tree = ElementTree.parse(self.xml)
        info_list = []
        for revision in tree.findall('Revision'):
            for key, value in revision.attrib.iteritems():
                values = dict()
                values[key] = value
                info_list.append(values)
                #print "%s: %s" % (key, value)
            for child in revision:
                values = dict()
                # this is needed to match the change description field.
                if child.tag == 'ChangeDescription':
                    values[child.tag] = child.text
                    #print "%s: %s" % (child.tag, child.text)
                else:
                    values[child.tag] = child.attrib.get('Name', '')
                    #print "%s: %s" % (child.tag, child.attrib.get('Name', ''))
                info_list.append(values)

            print

        for i in info_list:
            print(i)

    except Exception:
        raise
    finally:
        self.xml = None
于 2014-05-02T16:08:53.120 回答