如果重新声明名称空间定义,如何获取正确的名称空间?详细说明:前缀相同,但属性值不同,因此重新声明。你知道吗
即<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'])
])
这个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,就必须手动解决这个问题。你知道吗
相关问题 更多 >
编程相关推荐