2014-10-07 162 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。 祝你好运!