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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:38:11