使用Python中的ElementTree获取XML值

时间:2017-09-11 11:53:51

标签: python xml elementtree

我有这个XML文件:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="https://receasy1p1942606901trial.hanatrial.ondemand.com:443/rec/Accrual_PO.xsodata/"
    xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
    xmlns="http://www.w3.org/2005/Atom">
    <title type="text">accruals_po</title>
    <id>https://receasy1p1942606901trial.hanatrial.ondemand.com:443/rec/Accrual_PO.xsodata/accruals_po</id>
    <author>
        <name />
    </author>
    <link rel="self" title="accruals_po" href="accruals_po" />
    <entry>
        <id>https://receasy1p1942606901trial.hanatrial.ondemand.com:443/rec/Accrual_PO.xsodata/accruals_po('96372537-120')</id>
        <title type="text"></title>
        <author>
            <name />
        </author>
        <link rel="edit" title="accruals_po" href="accruals_po('96372537-120')"/>
        <category term="receasy.accruals_poType" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
        <content type="application/xml">
            <m:properties>
                <d:PO_NUMBER m:type="Edm.String">96372537-120</d:PO_NUMBER>
                <d:SAP_AMT m:type="Edm.Single">109</d:SAP_AMT>
                <d:GL_ACCOUNT m:type="Edm.Int64">65009000</d:GL_ACCOUNT>
                <d:COMPANY_CODE m:type="Edm.String">US10_OH</d:COMPANY_CODE>
                <d:CONFIRMED_ACCRUAL_AMT m:type="Edm.Single">109</d:CONFIRMED_ACCRUAL_AMT>
                <d:FINAL_APPROVER m:type="Edm.String">europe\bamcguir</d:FINAL_APPROVER>
                <d:FINAL_GL_ACCOUNT m:type="Edm.Int64">65009000</d:FINAL_GL_ACCOUNT>
                <d:FINAL_COMPANY_CODE m:type="Edm.String">US10_OH</d:FINAL_COMPANY_CODE>
                <d:RECONCILIATION m:type="Edm.String">Successful</d:RECONCILIATION>
            </m:properties>
        </content>
    </entry>
</feed>

我正在尝试以粗体显示下面突出显示的值,它们位于条目标记下。

96372537-120

109

65009000

US10_OH

109

欧洲\ bamcguir

65009000

US10_OH

成功

这是我目前获得值的代码。

import urllib2
import xmltodict
import xml.etree.ElementTree as ET
import requests

tree = ET.parse('export.xml')
root = tree.getroot()
for child in root:
    print child.tag, child.attrib
    for child2 in child:
        print child2.tag, child2.attrib
        for child3 in child2:
            print child3.tag, child3.attrib
            for child4 in child3:
                print child4.tag, child4.attrib
                for child5 in child4:
                    print child5.tag, child5.attrib

这是我为PO_NUMBER获得的输出的一部分。

{http://schemas.microsoft.com/ado/2007/08/dataservices}PO_NUMBER {'{http://schemas.microsoft.com/ado/2007/08/dataservices/metadata}type': 'Edm.String'}

我无法获得PO_NUMBER的值 96372537-120 。如何获得此值以及上面突出显示的其他值?

1 个答案:

答案 0 :(得分:1)

在ElementTree中,元素的(前导)文本节点在text属性上设置。 tag是XML标记的名称(以Clark的符号表示),attrib仅是XML属性(也是Clark的表示法)。

因此child5.text会为您提供所需的信息。

顺便提一下,您可以将Clark的符号{namespace}tag与ElementTree的常规查询API一起使用来直接访问内容或属性元素,您不必手动迭代所有内容:

tree.iter('{http://schemas.microsoft.com/ado/2007/08/dataservices/metadata}properties')

将为您提供树中所有“属性”对象的迭代器,然后您可以迭代每个属性并获取相应的子文本:

for child in property:
    print(child.text)

请注意混合内容的奇怪之处(当元素可以同时包含text和element子元素时):在ElementTree文档模型中,只有第一个子.text上设置为文本节点,否则在前面的元素上设置为.tail,例如

<foo>
    bar
    <qux/>
    baz
</foo>

foo.text == "bar",但“baz”将设置在qux.tail