Python ElementTree处理XML块时通配符匹配节点失败原因咨询
问题描述
给定如下XML块:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <abc:random xmlns:abc="http://www.mywebsite.com" schemaVersion="1.2"> <abc:header> <abc:number>8</abc:number> <abc:type>text/xml</abc:type> </abc:header> <abc:body> <abc:d> <abc:purpose>start</abc:purpose> </abc:d> </abc:body> </abc:random>
这些XML块是通过读取XML文件并按控制字符拆分字符串得到的。需求是遍历这些XML块,提取每个块中的节点标签及其对应文本,并将值存入Pandas DataFrame。
使用的Python代码如下:
for xml_block in list_of_string_blocks: tree = ET.ElementTree(ET.fromstring(xml_block)) root = tree.getroot() #for node in list(root): for node in list(tree): if node.tag.startswith(".//{*}header"): print(node.text)
代码中的if语句从未执行,.//{*}header通配符匹配未生效,请问原因是什么?
问题原因与解决方案
核心原因
- 遍历对象错误:
list(tree)遍历的是ElementTree对象的直接子节点,但ElementTree仅包含根节点<abc:random>,你需要遍历的是根节点的子节点,也就是list(root)。 - 标签匹配逻辑错误:
.//{*}header是XPath表达式,不能用startswith匹配节点的tag属性。节点的tag实际是带命名空间的完整格式,比如{http://www.mywebsite.com}header,和XPath格式完全不同,自然无法匹配。
修正后的代码
以下两种方式均可实现需求:
方式一:使用XPath查找(推荐)
通过命名空间映射配合XPath,可以精准定位节点:
import xml.etree.ElementTree as ET import pandas as pd data = [] # 定义XML命名空间映射 ns_map = {'abc': 'http://www.mywebsite.com'} for xml_block in list_of_string_blocks: root = ET.fromstring(xml_block) # 查找所有header节点 header_nodes = root.findall('.//abc:header', ns_map) for header in header_nodes: # 提取子节点文本 row = { 'number': header.find('abc:number', ns_map).text, 'type': header.find('abc:type', ns_map).text } data.append(row) # 转换为Pandas DataFrame df = pd.DataFrame(data)
方式二:直接遍历节点判断标签
如果不想用XPath,可以直接判断节点的完整命名空间标签:
import xml.etree.ElementTree as ET import pandas as pd data = [] ns_uri = 'http://www.mywebsite.com' for xml_block in list_of_string_blocks: root = ET.fromstring(xml_block) for node in root: # 匹配带命名空间的header标签 if node.tag == f'{{{ns_uri}}}header': number_node = node.find(f'{{{ns_uri}}}number') type_node = node.find(f'{{{ns_uri}}}type') # 确保节点存在再提取文本 if number_node and type_node: data.append({ 'number': number_node.text, 'type': type_node.text }) df = pd.DataFrame(data)
内容的提问来源于stack exchange,提问作者pymat
相关产品推荐
相关产品推荐

