查找特定XML元素属性值

1 投票
2 回答
1867 浏览
提问于 2025-04-17 13:10

使用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 个回答

1

你可以使用ElementTree这个工具包。它可以把XML文档转换成一个有层次结构的数据对象。

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))

如果你想找到那些属性TrdID$$开头的TrdMtchRpt元素,可以这样做:

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#'

可以查看这些文档:

撰写回答