WebService 从我的 XmlDocument 中删除 <xml> 标记

Posted

技术标签:

【中文标题】WebService 从我的 XmlDocument 中删除 <xml> 标记【英文标题】:WebService remove <xml> tag from my XmlDocument 【发布时间】:2011-04-07 17:50:23 【问题描述】:

我使用 WebService 将 XmlDocument 转换为 PDF。

我发送到 Web 服务的 XmlDocument 如下所示。

<?xml version="1.0" encoding="utf-16" ?> 
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
...
</fo:root>

我遇到了一个问题,所以我进入了调试模式,以发现当 XmlDocument 对象从我的 asp 网站本身传输到在 .NET 1.1 上工作的 Web 服务时会看到他的 xml 标签。删除此标签是否有原因?会不会是 SOAP 响应造成的?

除了手动将标签添加回文档之外,还有其他方法吗?

编辑

要回答约翰的问题,是的,我指的是处理指令。它只是消失了,我想知道为什么因为我用来转换的库没有它就无法工作。如果我手动添加它,它可以正常工作,但我只是想知道它为什么会消失。

编辑 2

即使它不是标签,需要 XmlDocument 的库没有它就无法工作,这就是我需要它的原因。除此之外,文档的其余部分已正确处理。从 Web Reference 生成的 Reference.cs 对于被调用的方法看起来像这样:

/// <remarks/>
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GeneratePdfFromXml", RequestNamespace="http://tempuri.org", ResponseNamespace="http://tempuri.org", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    [return: System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")]
    public byte[] GeneratePdfFromXml(XmlNode FormattedObjectXml) 
        object[] results = this.Invoke("GeneratePdfFromXml", new object[] 
                    FormattedObjectXml);
        return ((byte[])(results[0]));
    

这与我遇到的另一个问题相同,其中 XmlDocument 被引用为 XmlNode,因为 SOAP 响应本身就是一个 XmlDocument。

我只是把它改成了一个字符串; MyXmlDocument.OuterXml; 这样一来,一切都保留下来,没有问题。

【问题讨论】:

您指的是哪个“XML”标签? &lt;?xml&gt;?那是处理指令,而不是标签。它不应该引起任何问题。是什么让您认为这是问题所在? 再次强调,这不是标签,而是处理指令。请显示您正在删除处理指令的服务操作的签名(函数头)。很有可能它应该被删除,但让我们看看。 @John Saunders - 不是 PI,尽管它看起来像一个。请参阅“XML 声明是处理指令吗?”下的 [developerfusion.com/samplechapter/1704/beginning-xml/10/]。 XML 规范清楚地显示了 XML 声明 [w3.org/TR/2008/REC-xml-20081126/#NT-XMLDecl] 和处理指令 [w3.org/TR/2008/REC-xml-20081126/#sec-pi] 之间的区别 @lavinio:感谢您的认可。关键是,它不是标签。 【参考方案1】:

这很可能是编码问题。 XML 声明声称该文档采用 UTF-16 格式,即每个字符两个字节。另一个库可能会在它不存在的情况下假设一些其他编码。

【讨论】:

我认为这就是缺少指令时库失败的原因。【参考方案2】:

您永远不会收到通过XmlNodeXmlElementXmlDocument 参数传递给 ASMX 服务的 XML 声明或处理指令。仔细想想,原因就很明显了。 SOAP 请求类似于:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
    <SOAP-ENV:Body>
        <parameter>
            <?xml version="1.0" encoding="utf-16" ?> 
            <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            </fo:root>
        </parameter>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

但是XML声明只能出现在文档的最开始,所以这是无效的。

如您所见,解决方案是将此 XML 作为字符串发送。将参数类型设为string,或者使用XmlNode.OuterXml

【讨论】:

以上是关于WebService 从我的 XmlDocument 中删除 <xml> 标记的主要内容,如果未能解决你的问题,请参考以下文章

jqgrid添加行并将数据发送到webservice以进行插入

SAP 如何调用我的webservice?

SAP 如何调用我的webservice?

从服务 Android 运行类

我的第一次Webservice接口开发

iOS:不调用connectionDidFinishLoading