XML转SOAP格式时如何重写所有元素的CDATA节点?
Got it, let's work through transforming your XML (with CDATA-wrapped values) into a valid SOAP message. The main task here is stripping out the CDATA sections (since your values don't have XML-special characters) and wrapping everything in a standard SOAP envelope structure.
Expected SOAP Output
Here's what your input would look like as a properly formatted SOAP message:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:custom="http://your-custom-namespace.com"> <soapenv:Header/> <soapenv:Body> <custom:some> <custom:A>2</custom:A> <custom:B>test</custom:B> <custom:C>false</custom:C> <custom:D>test</custom:D> <custom:E>3</custom:E> <custom:F>4</custom:F> <custom:G>false</custom:G> <custom:H>3</custom:H> <!-- Add any remaining elements here --> </custom:some> </soapenv:Body> </soapenv:Envelope>
Important Details to Note:
- Namespaces: SOAP requires the envelope namespace (
http://schemas.xmlsoap.org/soap/envelope/), and you should add your own custom namespace (replacehttp://your-custom-namespace.comandcustomwith your actual project's namespace) for your elements. This avoids naming conflicts and follows SOAP standards. - CDATA Handling: Since your CDATA contains simple values (no
<,&, or other XML-reserved characters), we can safely replace<![CDATA[value]]>with justvalueas the text content of each element. If you ever have content with special characters, you'd need to escape them (e.g.,&for&) instead of stripping CDATA.
Automating the Transformation (Python Example)
If you need to do this programmatically, here's a quick script using the lxml library to process your input XML and generate the SOAP envelope:
from lxml import etree # Your input XML string input_xml = """<some> <A><![CDATA[2]]></A> <B><![CDATA[test]]></B> <C><![CDATA[false]]></C> <D><![CDATA[test]]></D> <E><![CDATA[3]]></E> <F><![CDATA[4]]></F> <G><![CDATA[false]]></G> <H><![CDATA[3]]></H> </some>""" # Parse the input XML root = etree.fromstring(input_xml) # Create the SOAP envelope structure soap_ns = "http://schemas.xmlsoap.org/soap/envelope/" custom_ns = "http://your-custom-namespace.com" soap_envelope = etree.Element(f"{{{soap_ns}}}Envelope") soap_header = etree.SubElement(soap_envelope, f"{{{soap_ns}}}Header") soap_body = etree.SubElement(soap_envelope, f"{{{soap_ns}}}Body") # Register namespaces for proper formatting etree.register_namespace("soapenv", soap_ns) etree.register_namespace("custom", custom_ns) # Copy elements to SOAP body, removing CDATA some_element = etree.SubElement(soap_body, f"{{{custom_ns}}}some") for child in root: # Extract the CDATA content (lxml automatically parses CDATA as text) element_value = child.text.strip() if child.text else "" # Create the new element with the custom namespace new_element = etree.SubElement(some_element, f"{{{custom_ns}}}{child.tag}") new_element.text = element_value # Print the formatted SOAP XML print(etree.tostring(soap_envelope, pretty_print=True, encoding="unicode"))
This script will take your input, process each element to remove CDATA, and wrap everything in a valid SOAP envelope. You can adjust the custom namespace to match your project's requirements.
内容的提问来源于stack exchange,提问作者damianoo

