如何使用Python中的xml.minidom获取直接子节点而不是具有相同标签名称的子孙节点

6

我一直在使用XML minidom从XML文件中获取一些数据,但是无法得到所需结果...尝试了很多与XML minidom相关的代码,但都失败了.. 这是我的样例XML文件..

<computer>
    <parts>
        <text>Required</text>
    </parts>
    <parts>
        <text>Required</text>
        <parts>
            <text>?Not Required</text>
        </parts>
        <parts>
            <text>?Not Required</text>
        </parts>
    </parts>
    <parts>
        <text>Required</text>
        <parts>
            <text>Not Required</text>
        </parts>
    </parts>
    <parts>
        <text>Required</text>
   </parts>
</computer>

我想获得“required”文本,但输出却是这样的。
Required
Required
Not Required
Not Required
Required
Not Required
Required

这是我的代码示例,可以从文件中获取所有文本,但我需要直接作为父标签子节点的标签内的文本...

from xml.dom import minidom
file=('d:\sample.xml')
xmldoc=minidom.parse(file)
parentnode = xmldoc.getElementsByTagName('computer')
for node in parentnode:
    alist=node.getElementsByTagName('text')
    for a in alist:
        t=a.childNodes[0].nodeValue
        print authortext

我希望得到的输出结果

Required
Required
Required
Required

getElementsByTagName 获取所有的后代元素。你需要获取所有子元素 - helderdarocha
我需要所有直接后代而非间接后代...你可以说我需要父子名称而不是他们孙子的名称... - Ali Malik
1个回答

5

除非你的实际XML更加复杂,否则你可以遍历DOM树并从computerparts节点中的text子节点获取所需的子节点:

import xml.dom.minidom

file=('sample.xml')
xmldoc=xml.dom.minidom.parse(file)
computerNode = xmldoc.getElementsByTagName('computer')
for computerChild in computerNode:
    for parts in computerChild.childNodes:
       for partsChild in parts.childNodes:
          if partsChild.nodeType == xml.dom.Node.ELEMENT_NODE: 
             if partsChild.tagName == 'text':
                print partsChild.childNodes[0].nodeValue

为了使用XPath和更简单的DOM导航,建议使用Element Tree API

要使用此功能,您需要链接上面提到的dom-xpath模块。您需要在系统中安装该模块(下载包,解压缩,进入目录,运行python setup.py install)。安装模块后,您的程序将找到它并运行。 - helderdarocha
我已经使用easy_install安装了py-dom-xpath,但是它给出了错误信息XPathParseError: Syntax error: /computer/parts/text - Ali Malik
可能是个bug,因为在我的安装(Mac)中可以运行。无论如何,要使用XPath,最好像我在上面的链接中建议的那样使用etree。我使用纯DOM修复了你的代码,应该可以工作。 - helderdarocha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接