使用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
相关产品推荐
相关产品推荐

