【问题标题】:Search for specific XML element Attribute values搜索特定的 XML 元素属性值
【发布时间】:2012-02-17 09:52:32
【问题描述】:

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

部分XML如下:

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

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

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

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

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

【问题讨论】:

    标签: python xml xpath elementtree


    【解决方案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#'
    

    查看文档:

    【讨论】:

    • 感谢@Tichodroma,我已将查询编辑得更具体,不幸的是我不允许使用lxml。问候。
    • 谢谢,看来这个 python 学习练习正在学习我用给我的工具不能做的事情!问候。
    • 可以提供一个简单的解决方案,其中:for val in xmlelement.attrib.iteritems(): slice = val[0:2] if slice = "$$": dosomething else: checknextelement
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      相关资源
      最近更新 更多