Python ElementTree iter()方法用XPath筛选DataType元素失败原因
问题:Python中使用iter()结合XPath无法匹配XML元素的原因
目标XML结构
<Content> <Controller Use="Context" Name="Base_Project_Maximum_Connections"> <DataTypes Use="Context"> <DataType Use="Target" Name="cs_dint" Family="NoFamily" Class="User"> <Members> <Member Name="Status" DataType="CONNECTION_STATUS" Dimension="0" Radix="NullType" Hidden="false" ExternalAccess="Read/Write" /> <Member Name="Data" DataType="DINT" Dimension="0" Radix="Decimal" Hidden="false" ExternalAccess="Read/Write" /> </Members> </DataType> </DataTypes> </Controller> </Content>
测试Python代码
def GetDataTypeFromElement(root, typeName = None): dataTypeIter = root.iter("DataType") for dataTypeElement in dataTypeIter: print ("Found a data type element") print ("Finished with first iteration") dataTypeIter = root.iter("DataType[@Name = 'cs_dint']") for dataTypeElement in dataTypeIter: print ("Found a data type element") print ("Finished with second iteration") return None
问题现象
第一次调用iter("DataType")能成功找到目标元素,但第二次用XPath表达式DataType[@Name = 'cs_dint']调用iter()却无法匹配到元素,请问原因是什么?
原因及解决方案
核心原因
Python的Element.iter()方法仅支持传入标签名称,它的作用是递归遍历当前元素下所有指定标签名的子元素,并不支持解析XPath表达式。你传入的DataType[@Name = 'cs_dint']会被当作一个完整的标签名去匹配,而XML中根本不存在这个名称的标签,所以自然找不到任何元素。
正确做法
如果需要使用XPath进行精准查询,应该使用Element.xpath()方法,它专门用于处理XPath表达式。修改后的代码如下:
def GetDataTypeFromElement(root, typeName = None): dataTypeIter = root.iter("DataType") for dataTypeElement in dataTypeIter: print("Found a data type element") print("Finished with first iteration") # 使用xpath方法执行属性过滤查询 dataTypeElements = root.xpath("//DataType[@Name='cs_dint']") for dataTypeElement in dataTypeElements: print("Found a data type element") print("Finished with second iteration") return None
代码说明
//DataType:表示从根节点开始,递归查找所有标签名为DataType的元素[@Name='cs_dint']:是属性过滤条件,筛选出Name属性值等于cs_dint的元素
这样就能精准定位到你需要的目标元素了。
内容的提问来源于stack exchange,提问作者ROBERT RICHARDSON
相关产品推荐
相关产品推荐

