如何在Python的xml minidom中获取直接子节点而非子孙节点的相同标签名

6 投票
1 回答
8654 浏览
提问于 2025-04-18 07:05

我在用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

1 个回答

5

除非你的XML文件复杂得多,否则你可以通过DOM树来找到你想要的子节点,这些子节点是属于computer节点下的parts节点里的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

撰写回答