使用lxml无法读取并查询GraphML文件问题求助
问题原因与解决方法
问题原因
你的XML文件使用了默认命名空间(xmlns="http://graphml.graphdrawing.org/xmlns"),所有<graph>、<node>元素都属于这个命名空间。你原代码的查询逻辑存在两处错误:
//graphml/node的写法混淆了根元素标签名和命名空间规则,graphml是根标签而非命名空间前缀,无法匹配正确的元素层级- 未指定元素所属的命名空间,lxml会将无命名空间的查询与带命名空间的元素视为完全不同的节点,自然无法找到目标元素
解决方法
以下两种方式都能正确提取<node>元素:
方式1:使用命名空间映射查询(推荐)
先定义命名空间字典,在XPath中通过前缀引用命名空间:
from lxml import etree tree = etree.parse("test1.graphml") # 自定义命名空间前缀,映射到XML的默认命名空间地址 ns_map = {"gml": "http://graphml.graphdrawing.org/xmlns"} # 带命名空间前缀的XPath,精准定位graph下的node元素 nodes = tree.findall('//gml:graph/gml:node', namespaces=ns_map) # 验证结果示例 print(f"共找到{len(nodes)}个节点") for node in nodes: print(f"节点ID:{node.get('id')}")
方式2:忽略命名空间查询(简单但不严谨)
通过local-name()匹配元素的本地名称,跳过命名空间校验:
from lxml import etree tree = etree.parse("test1.graphml") # 匹配所有本地名称为node的元素 nodes = tree.findall('//*[local-name()="node"]') print(f"共找到{len(nodes)}个节点")
内容的提问来源于stack exchange,提问作者user32882
相关产品推荐
相关产品推荐

