在xml中使用命名空间创建子元素

时间:2019-07-09 14:12:15

标签: python xml soap namespaces

我想创建这个xml,但是我不知道如何使用命名空间创建子元素IsAddSegments

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <ISAddSegments xmlns="http://www.blue-order.com/ma/integrationservicews/api">
            <accessKey>key</accessKey>
            <objectID>
                <guid>guid</guid>
            </objectID>
            <StratumName>STRATUM</StratumName>
            <Segments>
                <Segment>
                    <Begin>00:00:00:00</Begin>
                    <Content>TEXT</Content>
                    <End>00:00:10:00</End>
                </Segment>
            </Segments>
        </ISAddSegments>
    </soapenv:Body>
</soapenv:Envelope>

这就是我所拥有的:

import xml.etree.ElementTree as ET

Envelope = ET.Element("{http://www.w3.org/2003/05/soap-envelope}Envelope")
Body = ET.SubElement(Envelope, '{http://www.w3.org/2003/05/soap-envelope}Body')
ET.register_namespace('soapenv', 'http://www.w3.org/2003/05/soap-envelope')
ISAddSegments = ET.SubElement(Body, '{http://www.blue-order.com/ma/integrationservicews/api}ISAddSegments')
...

但这会在main元素中创建一个额外的名称空间,而这不是我所需要的。

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:ns1="http://www.blue-order.com/ma/integrationservicews/api" xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <ns1:ISAddSegments>

2 个答案:

答案 0 :(得分:0)

请考虑使用专用的SOAP模块,例如suds。然后,您可以通过向ns提供Element来创建自定义名称空间。该值应该是一个包含名称空间名称和定义它的URL的元组:

from suds.sax.element import Element

custom_namespace = ('custom_namespace', 'http://url/namespace.xsd')
element_with_custom_namespace = Element('Element', ns=custom_namespace)

print(element_with_custom_namespace)
# <custom_namespace:Element xmlns:custom_namespace="http://url/namespace.xsd"/>

答案 1 :(得分:0)

我用IMEX=1解决了这个问题:

lxml