用Python和minidom进行XML解析

我使用Python(minidom)来解析打印出类似这样的层次结构的XML文件(缩进在这里用于显示重要的层次关系):

My Document
Overview
    Basic Features
    About This Software
        Platforms Supported

相反,程序在节点上迭代多次,并产生以下打印重复节点. (在每次迭代中查看节点列表,很明显为什么它会这样做,但我似乎找不到一种方法来获取我正在寻找的节点列表.)

My Document
Overview
Basic Features
About This Software
Platforms Supported
Basic Features
About This Software
Platforms Supported
Platforms Supported

这是XML源文件:

<?xml version="1.0" encoding="UTF-8"?>
<DOCMAP>
    <Topic Target="ALL">
        <Title>My Document</Title>
    </Topic>
    <Topic Target="ALL">
        <Title>Overview</Title>
        <Topic Target="ALL">
            <Title>Basic Features</Title>
        </Topic>
        <Topic Target="ALL">
            <Title>About This Software</Title>
            <Topic Target="ALL">
                <Title>Platforms Supported</Title>
            </Topic>
        </Topic>
    </Topic>
</DOCMAP>

这是Python程序:

import xml.dom.minidom
from xml.dom.minidom import Node

dom = xml.dom.minidom.parse("test.xml")
Topic=dom.getElementsByTagName('Topic')
i = 0
for node in Topic:
    alist=node.getElementsByTagName('Title')
    for a in alist:
        Title= a.firstChild.data
        print Title

通过将较低级别的主题名称更改为“SubTopic1”和“SubTopic2”,可以通过不嵌套“主题”元素来解决问题.但是,我想利用内置的XML层次结构化,而不需要不同的元素名称;似乎我应该可以嵌套“主题”元素,应该有一些方法来知道我正在查看的“主题”级别.

我已经尝试了许多不同的XPath函数没有太多的成功.

最佳答案
让我把这个评论放在这里

谢谢你的尝试.它没有工作,但它给了我一些想法.以下工作(相同的概念; FWIW,nodeType是ELEMENT_NODE):

import xml.dom.minidom
from xml.dom.minidom import Node

dom = xml.dom.minidom.parse("docmap.xml")

def getChildrenByTitle(node):
    for child in node.childNodes:
        if child.localName=='Title':
            yield child

Topic=dom.getElementsByTagName('Topic')
for node in Topic:
    alist=getChildrenByTitle(node)
    for a in alist:
#        Title= a.firstChild.data
        Title= a.childNodes[0].nodeValue
        print Title

转载注明原文:用Python和minidom进行XML解析 - 代码日志