2014-10-07 169 views
-2

我有兩個xml列表,預期的和實際的。 對於預期列表中的每個預期,我想將它與每個實際進行比較,並確定是否與實際列表中的任何xml匹配。比較Python中xml的兩個列表

每個MESG看起來象下面這樣:

<?xml version="1.0" encoding="utf-8"?> 
\n 
<stlTxn> 
    <InstrumnetID>796</InstrumnetID> 
    <Version>0</Version> 
    <ProductType>OSTK</ProductType> 
    <Strike>190.0</Strike> 
    <AccountID>3236</AccountID> 
    <Symbol>ALV</Symbol> 
    <SettlAmount>1520000.0</SettlAmount> 
    <ClearingBusinessDate>2013-12-18</ClearingBusinessDate> 
    <CptySettlAccount>8501</CptySettlAccount> 
    <ProductISIN>DE00004005</ProductISIN> 
    <ProductCurrency>EUR</ProductCurrency> 
    <SettlCurrency>EUR</SettlCurrency> 
    <AccrIntAmount>0.0</AccrIntAmount> 
    <SettlQuantity>8000.0</SettlQuantity> 
    <AccountSponsor>CBKFR</AccountSponsor> 
    <CallPut>0</CallPut> 
    <DelvSettlPrice>190.0</DelvSettlPrice> 
    <AccountName>EXY</AccountName> 
    <CashSettlAmount>0.0</CashSettlAmount> 
    <Maturity>201312</Maturity> 
    <Side>0</Side> 
    <ClearingHouse>ECAG</ClearingHouse> 
    <AccrIntDays>0</AccrIntDays> 
    <DeliveryType>DELIVERY_AT_SETTLEMENT_AMOUNT</DeliveryType> 
    <ProductName>OPT ON ALLIANZ AG HOLDIN</ProductName> 
    <ProductSymbol>ALV</ProductSymbol> 
    <Currency>EUR</Currency> 
    <AccountOwner>CBKFR</AccountOwner> 
    <ValueDate>2013-12-20</ValueDate> 
    <ProductID>jigfj</ProductID> 
</stlTxn> 

我試圖用美麗的湯包:

from bs4 import BeautifulSoup 
    expected_parsed = BeautifulSoup(expected) 
    actual_parsed = BeautifulSoup(actual) 
    if expected_parsed.text != actual_parsed.text: 
     print "failed" 
+0

通過比較你的意思是列表級別或項目級別上的完全匹配? – 2014-10-07 12:59:13

+0

我想比較每個元素的值,例如instrumentid,版本等。 – user2968440 2014-10-07 13:17:30

回答

0

這個問題麻煩比它初看起來似乎爲元素的細碎,可改變,以及層次結構。你只是真的想比較類似的XML文檔。我建議你看一下lxml模塊,然後依次解析第一個XML和每個標記檢查以查看第二個A:是否具有相同的標記B:具有相同的標記值並且C:具有相同的屬性。

如果你有能力承擔這兩個XML文檔將始終具有相同的元素,並在同一層次結構,那麼您可能會發現以下有趣...

from lxml import etree 
import os 

def compareXMLs(xmlFilePath1, xmlFilePath2): 
    if not os.path.isfile(xmlFilePath1): 
    raise Exception("Invalid file path: \'" + str(xmlFilePath1) + "\'") 
    if not os.path.isfile(xmlFilePath1): 
    raise Exception("Invalid file path: \'" + str(xmlFilePath2) + "\'") 

    xmlDoc1 = etree.parse(xmlFilePath1) 
    xmlDoc2 = etree.parse(xmlFilePath2) 

    if set(xmlDoc1.getroot().itertext()) == set(xmlDoc2.getroot().itertext()): 
    return True 
    return False 

這是我第二以往堆棧溢出如果這是一個垃圾回答,那麼請原諒我。 哦,我從來沒有嘗試過,但我認爲etree.parse()方法也可以採用HTTP/FTP URL。 祝你好運!