如何使用Python区分XML中同名的不同标签

How to distinguish different tags with the same name in XML by using Python

我想从一个 xml 文件中提取特定元素。但是 xml 中有很多相同的标签。如果我们有以下 xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns="SimpleClass">
  <Class name="AcademicInstitution" is_persistent="false">
    <attrs name="name" is_primary="true" type="/11"/>
  </Class>
  <Class name="Company" is_persistent="false" parent="/9">
    <attrs name="manager" is_primary="false" type="/3"/>
  </Class>
  <Class name="Faculty" is_persistent="false" parent="/0">
    <attrs name="address" is_primary="false" type="/7"/>
    <attrs name="dean" is_primary="false" type="/3"/>
  </Class>
  <Class name="Person" is_persistent="true">
    <attrs name="name" is_primary="true" type="/11"/>
    <attrs name="works_for" is_primary="false" type="/9"/>
  </Class>
  <Class name="Document" is_persistent="true">
    <attrs name="number" is_primary="true" type="/10"/>
    <attrs name="author" is_primary="false" type="/3"/>
    <attrs name="content" is_primary="false" type="/11"/>
  </Class>
  <Class name="Student" is_persistent="false" parent="/3">
    <attrs name="studiesIn" is_primary="false" type="/6"/>
    <attrs name="supervisor" is_primary="false" type="/3"/>
  </Class>
  <Class name="University" is_persistent="false" parent="/9">
    <attrs name="faculty" is_primary="false" type="/2"/>
  </Class>
  <Class name="Address" is_persistent="false">
    <attrs name="city" is_primary="false" type="/11"/>
    <attrs name="street" is_primary="false" type="/11"/>
    <attrs name="postcode" is_primary="false" type="/11"/>
  </Class>
  <Class name="Task" is_persistent="true">
    <attrs name="name" is_primary="true" type="/11"/>
    <attrs name="number" is_primary="true" type="/10"/>
    <attrs name="description" is_primary="false" type="/4"/>
  </Class>
  <Class name="Organization" is_persistent="true">
    <attrs name="name" is_primary="true" type="/11"/>
    <attrs name="address" is_primary="false" type="/7"/>
  </Class>
  <PrimitiveDataType name="Integer"/>
  <PrimitiveDataType name="String"/>
  <Association name="address" src="/3" dest="/7"/>
  <Association name="performsTask" src="/3" dest="/8"/>
</xmi:XMI>

我们可以发现有很多'Class'个标签和'attrs'个标签。

我可以通过下面的代码获取标签

import xml.etree.ElementTree as ET

tree = ET.parse('test2.xmi')
root = tree.getroot()

for ele in tree.getiterator():
    _, _, tag = ele.tag.rpartition('}')

输出是:

XMI
Class
attrs
Class
attrs
Class
attrs
attrs
...

我想要的输出是:

Class(Class0)
attrs(Class0)
Class(Class1)
attrs(Class1)
Class(Class2)
attrs(Class2)
attrs(Class2)
...

我的想法是使用 Python ElementTree 来解析 xml 文件并获取标签。但是我不知道如何为每个标签分配一个唯一的标签(例如:'Tag'+number)。还有,如何让每个子节点都得到父节点的唯一标签(Class(Class0) and attrs(Class0))?

我想我已经做到了:

import xml.etree.ElementTree as ET

tree = ET.parse('test2.xmi')
root = tree.getroot()

for i in range(0,len(root)):
    _, _, roottag = root[i].tag.rpartition('}')
    for ele in root[i].getiterator():
        _, _, tag = ele.tag.rpartition('}')
        print str(tag)+"("+str(roottag)+str(i)+")"

如果有人有更好的想法,我很高兴听到!