搜索特定的XML元素属性值

时间:2012-02-17 09:52:32

标签: python xml xpath elementtree

使用Python ElementTree构建和编辑测试消息:

XML的一部分如下:

<FIXML>
<TrdMtchRpt TrdID="$$+TrdID#" RptTyp="0" TrdDt="20120201" MtchTyp="4" LastMkt="ABCD" LastPx="104.11">

密钥TrdID包含以$$开头的值,用于标识此值是可变数据,并且需要在从模板构造消息后对其进行修改,在本例中为下一个序列号(存储在字典中 - 总体思路是从列出属性键的文件加载字典,并使用相关值(例如下一个序列号,例如字典文件包含$$+TrdID# 12345,使用空格作为分隔符)。

到目前为止,我的脚本迭代解析的XML并依次检查每个索引元素。 xml文件中有几个需要更新的字段,因此我需要避免使用对元素标记的硬编码引用。

如何搜索元素/属性以识别属性是否包含相应值以其开头的键或包含特定字符串$$

由于我不知道的原因,我们不能使用lxml!

2 个答案:

答案 0 :(得分:1)

您可以使用XPath。

import lxml.etree as etree
import StringIO from StringIO

xml = """<FIXML>
           <TrdMtchRpt TrdID="$$+TrdID#"
                       RptTyp="0"
                       TrdDt="20120201"
                       MtchTyp="4"
                       LastMkt="ABCD"
                       LastPx="104.11"/>
         </FIXML>"""

tree = etree.parse(StringIO(xml))

要查找属性TrdMtchRptTrdID开头的元素$$

r = tree.xpath("//TrdMtchRpt[starts-with(@TrdID, '$$')]")
r[0].tag == 'TrdMtchRpt'
r[0].get("TrdID") == '$$+TrdID#'

如果你想找到任何元素,其中至少有一个属性$$开头,你可以这样做:

r = tree.xpath("//*[starts-with(@*, '$$')]")
r[0].tag == 'TrdMtchRpt'
r[0].get("TrdID") == '$$+TrdID#'

查看文档:

答案 1 :(得分:1)

您可以使用ElementTree包。它为您提供了一个XML文档中具有分层数据结构的对象。