搜索特定的XML元素的属性值

问题描述:

使用Python的ElementTree构建和编辑测试消息:搜索特定的XML元素的属性值

XML的部分内容如下:

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

关键TrdID包含具有$$开始值,以确定该值是可变数据,一旦消息从模板构造出来,需要修改,在这种情况下,应该修改为下一个序列号(存储在字典中 - 总体思路是从列出属性键的文件加载字典并关联值,例如下一个序列号,例如字典文件包含使用空格作为分隔的$$+TrdID# 12345)。

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

如何搜索元素/属性以确定属性是否包含对应值开头的关键字或包含特定字符串$$

而对于我未知的原因,我们不能使用lxml!

您可以使用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)) 

要查找元素TrdMtchRpt其中属性TrdID开始与$$

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

请查看文档:

+0

谢谢@Tichodroma,我编辑我的查询是更具体的,不幸的是我不允许使用lxml。问候。 – 2012-02-17 10:35:14

+0

没有XPath?多可惜! – 2012-02-17 10:40:09

+0

谢谢,看来这个python学习练习正在学习我无法用我得到的工具做什么!问候。 – 2012-02-17 10:55:42

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