【问题标题】:How can I add a XML as an inner text within another XML, as a parameter of a SOAP request如何将 XML 添加为另一个 XML 中的内部文本,作为 SOAP 请求的参数
【发布时间】:2020-03-11 03:26:30
【问题描述】:

例如,我想在 XML SOAP 中将 XML 作为参数发送:

   <soapenv:Header/>
   <soapenv:Body>
      <doc:makeSomething>
         <param1>blah blah</param1>
         <pamar2>3.14159</param2>
         <xml>
                 <!-- this is what i want to insert -->
                 <myDOC>
                     <tag1>xxx</tag1>
                     <tag2>yyy</tag2>
                     .....
                     .....
                 </myDOC>                 
         </xml>
      </doc:makeSomething>
   </soapenv:Body>
</soapenv:Envelope>

我能做什么?使用 urlencode?​​p>

【问题讨论】:

  • 解决方法是:``` blah blah3.14159 xxxyyy ..... ..... ]]> ```

标签: xml soap encode urlencode


【解决方案1】:

您可以简单地使用 XSLT-1.0 的fn:document(...) 函数。
因此,使用带有以下文件的 XSLT 处理器将 insert.xml 插入到输入 XML 中的所需位置。以下 XML

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope/" xmlns:doc="http://some.doc">
    <soapenv:Header/>
    <soapenv:Body>
        <doc:makeSomething>
            <param1>blah blah</param1>
            <param2>3.14159</param2>
            <xml>
                <!-- this is what i want to insert -->
                <myDOC>
                    <tag1>xxx</tag1>
                    <tag2>yyy</tag2>
                    .....
                    .....
                </myDOC>
            </xml>
        </doc:makeSomething>
    </soapenv:Body>
</soapenv:Envelope>

这个 XML 文件名为 insert.xml 插入

<Items>   
 <Item id='1'/>
 <Item id='3'/>
 <Item id='5'/>
 <Item id='7'/>
</Items>

使用这个 XSLT-1.0 样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope/" xmlns:doc="http://some.doc" version="1.0"> 
    <xsl:output method="xml" indent="yes" version="1.0" encoding="utf-8" />

    <!-- Identity template -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/soapenv:Envelope/soapenv:Body/doc:makeSomething/xml">
        <xsl:copy>
            <xsl:copy-of select="document('insert.xml')"/>
            <xsl:copy-of select="node()"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

将产生以下输出:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope/" xmlns:doc="http://some.doc">
    <soapenv:Header/>
    <soapenv:Body>
        <doc:makeSomething>
            <param1>blah blah</param1>
            <param2>3.14159</param2>
            <xml>
                <!-- Here the file 'insert.xml' is inserted -->
                <Items>
                    <Item id="1"/>
                    <Item id="3"/>
                    <Item id="5"/>
                    <Item id="7"/>
                </Items>
                <!-- Here the already present part is copied -->
                <myDOC>
                    <tag1>xxx</tag1>
                    <tag2>yyy</tag2>
                    .....
                    .....
                </myDOC>
            </xml>
        </doc:makeSomething>
    </soapenv:Body>
</soapenv:Envelope>

这就是 XSLT 的作用。
这是完成所需任务的最简单方法之一。

【讨论】:

  • 这不是我需要的,也就是说,如果您想从另一个 xml 添加或插入新节点。另一方面,我需要添加一个 xml 作为内部文本,
【解决方案2】:

解决办法是在]]>

之间envolve data-xml
<soapenv:Header/>
   <soapenv:Body>
      <doc:makeSomething>
         <param1>blah blah</param1>
         <pamar2>3.14159</param2>
         <xml>
                 <![CDATA[
                 <?xml version="1.0" encoding="ISO-8859-1"?>
                 <myDOC>
                     <tag1>xxx</tag1>
                     <tag2>yyy</tag2>
                     .....
                     .....
                 </myDOC>                 
                 ]]>
         </xml>
      </doc:makeSomething>
   </soapenv:Body>
</soapenv:Envelope>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多