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”标签?<?xml>
?那是处理指令,而不是标签。它不应该引起任何问题。是什么让您认为这是问题所在?
再次强调,这不是标签,而是处理指令。请显示您正在删除处理指令的服务操作的签名(函数头)。很有可能它应该被删除,但让我们看看。
@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】:您永远不会收到通过XmlNode
、XmlElement
或XmlDocument
参数传递给 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> 标记的主要内容,如果未能解决你的问题,请参考以下文章