查找特定XML元素属性值
使用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#'
可以查看这些文档: