比较python中的两个xmls列表

时间:2014-10-07 12:57:14

标签: python xml

我有两个xml,expect和actual列表。 对于预期列表中的每个预期列表,我想将其与每个实际值进行比较,并找出是否与实际列表中的任何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"

1 个答案:

答案 0 :(得分: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。 祝你好运!