元素树:如何解析子节点的子元素

时间:2014-02-03 15:24:36

标签: python xml elementtree

我有一个XML树,我想用Elementtree解析它。我的XML看起来像

<?xml version="1.0" encoding="UTF-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
<Ack>Success</Ack>
<Version>857</Version>
<Build>E857_INTL_APIXO_16643800_R1</Build>
<PaginationResult>
    <TotalNumberOfPages>1</TotalNumberOfPages>
    <TotalNumberOfEntries>2</TotalNumberOfEntries>
</PaginationResult>
<HasMoreOrders>false</HasMoreOrders>
<OrderArray>
    <Order>
        <OrderID>221362908003-1324471823012</OrderID>
        <CheckoutStatus>
            <eBayPaymentStatus>NoPaymentFailure</eBayPaymentStatus>
            <LastModifiedTime>2014-02-03T12:08:51.000Z</LastModifiedTime>
            <PaymentMethod>PaisaPayEscrow</PaymentMethod>
            <Status>Complete</Status>
            <IntegratedMerchantCreditCardEnabled>false</IntegratedMerchantCreditCardEnabled>
        </CheckoutStatus>
    </Order>
    <Order> ...
    </Order>
    <Order> ...
    </Order>
</OrderArray>
</GetOrdersResponse>

我想解析XML的第6个子节点()我能够通过索引获得子元素的值。例如,如果我想要第一个订单的OrderID,我可以使用root[5][0][0].text。但是,我想按名称获取subElements的值。我尝试了以下代码,但它没有打印任何内容:

tree = ET.parse('response.xml')
root = tree.getroot()
for child in root:
    try:
        for ids in child.find('Order').find('OrderID'):
            print ids.text
    except:
        continue

有人可以帮助我。感谢

3 个答案:

答案 0 :(得分:3)

由于XML文档具有名称空间声明(xmlns="urn:ebay:apis:eBLBaseComponents"),因此在引用文档中的元素时必须使用通用名称。例如,您需要{urn:ebay:apis:eBLBaseComponents}OrderID而不仅仅是OrderID

此代码段打印文档中的所有OrderID:

from xml.etree import ElementTree as ET

NS = "urn:ebay:apis:eBLBaseComponents"

tree = ET.parse('response.xml')

for elem in tree.iter("*"):    # Use tree.getiterator("*") in Python 2.5 and 2.6
    if elem.tag == '{%s}OrderID' % NS:
        print elem.text

有关ElementTree和命名空间的详细信息,请参阅http://effbot.org/zone/element-namespaces.htm

答案 1 :(得分:1)

尽量避免链接你的发现。如果您的第一个find找不到任何内容,则会返回None

for child in root:
    order = child.find('Order')
    if order is not None:
        ids = order.find('OrderID')
        print ids.text

答案 2 :(得分:1)

您可以先找到OrderArray,然后按名称迭代其子项:

tree = ET.parse('response.xml')
root = tree.getroot()
order_array = root.find("OrderArray")
for order in order_array.findall('Order'):
    order_id_element = order.find('OrderID')
    if order_id_element is not None:
        print order_id_element.text

旁注。永远不要使用except: continue。它隐藏了你得到的任何异常,并使调试变得非常困难。