我查看了有关此问题的其他问题,但没有一个对我有帮助。我正在使用 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() 调用中复制粘贴元素的全名,但仍然找不到它。有人可以帮助我吗?
修改即可
'authorization_number':authorization_number 如果authorization_number 否则无,
到
'authorization_number':authorization_number(如果authorization_number 不是 None else None),
您可能还想附加authorization_number.text而不是整个分支,并对其他if语句进行类似的修改。
应该可以通过 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