在Python中使用嵌套标记解析XML数据

时间:2014-10-13 23:46:32

标签: python xml

我正在尝试使用ElementTree解析下面显示的格式的XML数据:

<dataset>
<title>Birds of Kafiristan</title>
    <creator>
        <individualName>
            <givenName>James</givenName>
            <surName>Brooke</surName>
        </individualName>
    </creator>
    <creator>
        <organizationName>Bird Conservation Alliance</organizationName>
        <address>
            <deliveryPoint>P.O. Box 999</deliveryPoint>
            <deliveryPoint>Mailstop 1234</deliveryPoint>
            <city>Washington</city>
            <administrativeArea>DC</administrativeArea>
            <postalCode>9999</postalCode>
            <country>USA</country>
        </address>
        <phone phonetype="voice">999-999-9999 x 123</phone>
        <phone phonetype="fax">999-999-9999</phone>
        <electronicMailAddress>contact@birds.org</electronicMailAddress>
        <onlineUrl>http://www.birds.org/</onlineUrl>
    </creator>
    <contact>
        <individualName>
            <givenName>Josiah</givenName>
            <surName>Harlan</surName>
        </individualName>
    </contact>
    <pubDate>2010</pubDate>
    <abstract>
         <para>This dataset contains the results of a bird survey from Kafiristan</para>
    </abstract>
    <keywordSet>
         <keyword>birds</keyword>
         <keyword>biodiversity</keyword>
         <keyword>animal ecology</keyword>
    </keywordSet>
    <distribution>
        <online>
           <url>http://birds.org/datasets</url>
        </online>
   </distribution>
</dataset>

(事实上,这只是一个更大的数据集的一个片段,其中包含其他标签,但它足以提出我的问题。)

我想简单地使用以下代码获取每个标记的元素值:

from xml.etree import ElementTree as ET

rootElement = ET.parse("example.xml").getroot()

for subelement in rootElement:
    for subsub in subelement:
        print subsub.tag,"-->", subsub.text #, subsub.attrib, subsub.items()
        for subsubsub in subsub:
            print subsubsub.tag, "-->", subsubsub.text

Ruiing上面的代码片段,我得到了一些元素的值,但不是全部 - 实际上,我无法获得嵌套元素的值(&#34; givenName&#34;和&#34; surName&#34 ;,嵌套在&#34; individualName&#34;里面,然后嵌套到&#34; creator&#34;)。

任何提示或提示?

与往常一样,提前感谢您提供的任何帮助1

1 个答案:

答案 0 :(得分:1)

看起来像defaultdict在这里可能有用:

d = collections.defaultdict(list)
for element in rootElement.iter():
    d[element.tag].append(element.text)

这将为您提供标记的映射,其中包含与每个标记关联的“文本”列表(每个元素的一个项目与xml中的该标记。)