使用python ElementTree和重新声明的名称空间从xml中查找名称空间

2024-05-23 21:06:45 发布

您现在位置:Python中文网/ 问答频道 /正文

如果重新声明名称空间定义,如何获取正确的名称空间?详细说明:前缀相同,但属性值不同,因此重新声明。你知道吗

<site:Stack xmlns:site='http://stackoverflow.com'><site:Stack xmlns:site='https://math.stackexchange.com/'>

从我在微软的XML文档中读到的内容来看,这是可以接受的,它只是重新声明名称空间。除非这是不可接受的形式,否则我可以结束这个问题。你知道吗

这是一个问题,因为它打乱了大多数获取名称空间的字典方法,但也打乱了标准库中的ElementTree.register_namespace(prefix, uri)方法。 Register\u namespace非常重要,因为它用于解析名称空间标记,因为ET解析以clark表示法给出标记,例如Header元素,as <{http://schemas.xmlsoap.org/soap/envelope/}:Header/> 使用register\u namespace将上述内容解析回<SOAP-ENV:Header/>。 这给我带来了严重的问题,因为我正在将XML反序列化为自定义类对象,然后(在一些处理/编辑之后)重新序列化为格式良好的XML文件。你知道吗

例如,来自Oracle的XML示例。 注意订单如何更改以确认,但前缀相同。你知道吗

<PO:order xmlns:PO="http://gizmos.com/orders/">更改为 <PO:confirmation xmlns:PO="http://gizmos.com/confirm">

<?xml version="1.0" encoding="utf-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
    <SOAP-ENV:Fault>
        <faultcode>SOAP-ENV:Client</faultcode>
        <faultstring>Message does not have necessary info</faultstring>
        <faultactor>http://gizmos.com/order</faultactor>
            <detail>
                <PO:order xmlns:PO="http://gizmos.com/orders/">
                Quantity element does not have a value
                </PO:order>
                <PO:confirmation xmlns:PO="http://gizmos.com/confirm">
                Incomplete address: no zip code
                </PO:confirmation>
            </detail>
    </SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

请注意:我知道您可以使用以下方法获取具有名称空间的字典。但这将使用任何名称空间的最新声明。同样地ET.register\u命名空间将执行相同的操作,这是最近使用的声明。你知道吗

import xml.etree.ElementTree as ET
my_namespaces = dict([
    node for (_, node) in ET.iterparse('file.xml', events=['start-ns'])
])

Tags: env名称comhttp声明site空间order
1条回答
网友
1楼 · 发布于 2024-05-23 21:06:45

这个XML格式良好,可以正常工作。如果您只使用标准库中的ElementTree,ElementTree.register\u命名空间(prefix,uri)不能用于解析名称空间,因为作为参数输入的词典将不起作用,因为您将有具有不同uri的重复前缀,这对于python词典也是无效的。你知道吗

如果使用xpath,有一个解决方案,它使用到前缀的唯一映射。以oraclexml为例。P1 maps to PO to http://gizmos.com/orders/P2 maps to PO to http://gizmos.com/confirm/

如果不编辑原始的XML并且只使用ElementTree,就必须手动解决这个问题。你知道吗

相关问题 更多 >