2012-02-17 73 views
1

使用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!

回答

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

要查找元素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

1

可以使用ElementTree包。它爲您提供了一個來自XML文檔的具有分層數據結構的對象。