ElementTree 找不到子元素之一

问题描述 投票:0回答:2

我查看了有关此问题的其他问题,但没有一个对我有帮助。我正在使用 ElementTree 解析 XML,但在查找特定标签时遇到问题,该标签可能是可选的,而我可以毫无问题地找到其他(可选)标签。

相关 XML 片段:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns4:ExportActualMedicines xmlns="urn:be:fgov:ehealth:samws:v2:actual:common" ... xmlns:ns4="urn:be:fgov:ehealth:samws:v2:export" xmlns:ns5="urn:be:fgov:ehealth:samws:v2:refdata" ... version="6.0" SamId="E.20240325_150005">
    <ns4:Amp code="SAM660978-00">
        <ns4:Ampp ctiExtended="660978-01">
            <ns4:Data from="2023-01-10" to="2023-01-31">
                <AuthorisationNr>HO-BE-UH660978</AuthorisationNr>
                <ParallelCircuit>0</ParallelCircuit>
                <PackDisplayValue>
                    ...
                </PackDisplayValue>
                <Status>AUTHORIZED</Status>
                ...
            </ns4:Data>
        </ns4:Ampp>
    </ns4:Amp>
</ns4:ExportActualMedicines>

现在,“ns4:Data”下的所有标签都可以正常找到,但似乎找不到“AuthorizationNr”。

我的Python代码的相关片段:

NS4 = '{urn:be:fgov:ehealth:samws:v2:export}'
XMLNS = '{urn:be:fgov:ehealth:samws:v2:actual:common}'

tree = ET.parse(file)
root = tree.getroot()
for amp in root.findall(f'{NS4}Amp')
    for item in amp:
        if item.tag == f'{NS4}Ampp':
           ampp = {'code': item.attrib['ctiExtended'],
                   'data': []}

           for elem in item:
               if elem.tag == f'{NS4}Data':
                   authorisation_number = elem.find(f'{XMLNS}AuthorisationNr')
                   parallel_circuit = elem.find(f'{XMLNS}ParallelCircuit')
                   pack_display_value = elem.find(f'{XMLNS}PackDisplayValue')
                   ampp['data'].append({
                     'from': elem.attrib['from'],
                     'to': elem.attrib['to'] if 'to' in elem.attrib else None,
                     'authorisation_number': authorisation_number if authorisation_number else None,
                     'pack_display_value': pack_display_value[0].text if pack_display_value else None,
                     'parallel_circuit': parallel_circuit.text if parallel_circuit else None
                     ...
                   })

当我简单地迭代“ns4:Data”的所有子元素时,“AuthorizationNr”就会出现。

if elem.tag == f'{NS4}Data':
    for data in elem:
        print(data)

---
Output:
<Element '{urn:be:fgov:ehealth:samws:v2:actual:common}AuthorisationNr' at 0x00000212DB3235B0>
...
<Element '{urn:be:fgov:ehealth:samws:v2:actual:common}ParallelCircuit' at 0x00000212DB323D80>
<Element '{urn:be:fgov:ehealth:samws:v2:actual:common}PackDisplayValue' at 0x00000212DB323E20>
...

我什至尝试在 find() 调用中复制粘贴元素的全名,但仍然找不到它。有人可以帮助我吗?

python xml elementtree
2个回答
1
投票

修改即可

'authorization_number':authorization_number 如果authorization_number 否则无,

'authorization_number':authorization_number(如果authorization_number 不是 None else None),

您可能还想附加authorization_number.text而不是整个分支,并对其他if语句进行类似的修改。


0
投票

应该可以通过 xpath 直接访问:

import xml.etree.ElementTree as ET

xml_str="""<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns4:ExportActualMedicines xmlns="urn:be:fgov:ehealth:samws:v2:actual:common" xmlns:ns4="urn:be:fgov:ehealth:samws:v2:export" xmlns:ns5="urn:be:fgov:ehealth:samws:v2:refdata" version="6.0" SamId="E.20240325_150005">
    <ns4:Amp code="SAM660978-00">
        <ns4:Ampp ctiExtended="660978-01">
            <ns4:Data from="2023-01-10" to="2023-01-31">
                <AuthorisationNr>HO-BE-UH660978</AuthorisationNr>
                <ParallelCircuit>0</ParallelCircuit>
                <PackDisplayValue>
                </PackDisplayValue>
                <Status>AUTHORIZED</Status>
            </ns4:Data>
        </ns4:Ampp>
    </ns4:Amp>
</ns4:ExportActualMedicines>"""

root = ET.fromstring(xml_str)

authorisation_number = root.find('.//{urn:be:fgov:ehealth:samws:v2:actual:common}AuthorisationNr').text
print(authorisation_number)

输出:

HO-BE-UH660978
© www.soinside.com 2019 - 2024. All rights reserved.