You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python解析XML时有效字段返回空白的问题求助

解决Python解析XML元素字段返回空白的问题

嘿,我来帮你搞定这个XML解析的问题!你说用Python的xml.dom.minidom解析时能找到对应元素,但拿不到内容返回空白,这问题我之前也碰过,大概率是对minidom的文本节点处理逻辑没摸透~

先把你提供的XML内容完整列出来方便参考:

<TestReport version="1.0"> 
    <scans> 
        <scan id="98" name="TestSite"/> 
    </scans>
    <nodes> 
        <node address="192.168.1.7" status="alive" hardware-address="000C2EBC10"> 
            <names> 
                <name>Alpha</name> 
            </names> 
        </node> 
    </nodes> 
</TestReport>

问题根源

xml.dom.minidom会把XML里的换行、缩进这些空白字符也解析成Text节点。比如<name>Alpha</name>周围的换行和空格,会被当成独立的空白Text节点,如果你直接取元素的firstChild,很可能拿到的是这些空白节点,而非包含"Alpha"的有效文本节点,自然就返回空白了。

另外还要注意:如果是要获取元素的属性(比如<scan>的name、<node>的address),不能用文本节点的方式获取,得用专门的属性方法。

解决方案(基于xml.dom.minidom)

下面是补全并修正后的脚本,包含两种稳妥的文本获取方式:

import xml.dom.minidom

def main():
    # 可以替换成从文件读取:doc = xml.dom.minidom.parse("你的XML文件路径.xml")
    xml_content = '''
<TestReport version="1.0"> 
    <scans> 
        <scan id="98" name="TestSite"/> 
    </scans>
    <nodes> 
        <node address="192.168.1.7" status="alive" hardware-address="000C2EBC10"> 
            <names> 
                <name>Alpha</name> 
            </names> 
        </node> 
    </nodes> 
</TestReport>
    '''
    doc = xml.dom.minidom.parseString(xml_content)

    # 示例1:获取<name>元素的文本内容
    name_elements = doc.getElementsByTagName('name')
    if name_elements:
        name_element = name_elements[0]
        
        # 方法1:检查子节点类型,只取有效文本节点
        if name_element.firstChild and name_element.firstChild.nodeType == xml.dom.minidom.Node.TEXT_NODE:
            name_text = name_element.firstChild.data.strip()
            print(f"节点名称:{name_text}")
        
        # 方法2:更稳妥,遍历所有子节点提取文本并拼接
        name_text = ''.join([child.data.strip() for child in name_element.childNodes if child.nodeType == xml.dom.minidom.Node.TEXT_NODE])
        print(f"节点名称(稳妥版):{name_text}")

    # 示例2:获取<scan>元素的name属性
    scan_elements = doc.getElementsByTagName('scan')
    if scan_elements:
        scan_element = scan_elements[0]
        scan_name = scan_element.getAttribute('name')
        print(f"扫描名称:{scan_name}")

if __name__ == "__main__":
    main()

更简洁的替代方案:用xml.etree.ElementTree

如果你不想跟minidom的节点逻辑较劲,Python标准库的xml.etree.ElementTree处理文本内容更直观,代码也更简洁:

import xml.etree.ElementTree as ET

def main():
    xml_content = '''
<TestReport version="1.0"> 
    <scans> 
        <scan id="98" name="TestSite"/> 
    </scans>
    <nodes> 
        <node address="192.168.1.7" status="alive" hardware-address="000C2EBC10"> 
            <names> 
                <name>Alpha</name> 
            </names> 
        </node> 
    </nodes> 
</TestReport>
    '''
    root = ET.fromstring(xml_content)

    # 获取<name>的文本
    name_element = root.find('.//name')
    if name_element:
        name_text = name_element.text.strip()
        print(f"节点名称:{name_text}")

    # 获取<scan>的name属性
    scan_element = root.find('.//scan')
    if scan_element:
        scan_name = scan_element.get('name')
        print(f"扫描名称:{scan_name}")

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者jaytea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:21:46