2011-04-07 55 views
1

我使用WebService将XmlDocument转换为PDF。WebService从我的XmlDocument中删除<xml>标记

我发送到Web服务的XmlDocument看起来像这样。

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

我有一个问题,所以我在调试国防部去发现,当XmlDocument对象是从我的ASP网站本身转移到Web服务,基于.NET 1.1的作品看到他 XML标记。是否有这个标签被删除的原因?它可能是由SOAP响应引起的吗?

有没有办法在手动添加标签回文档?

编辑

要回答John的问题,是我的意思是处理指令。它刚刚熄灭,我想知道为什么,因为我用来转换的库在没有它的情况下无法正常工作。如果我手动添加它,它工作正常,但我只是想知道它为什么消失。

编辑2

即使它不是一个标签,需要XmlDocument的只是不无它的工作库就是为什么我需要它。除此之外,文档的其余部分正确处理。从Web引用生成的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的作为,因为SOAP响应XmlNode的引用是的XmlDocument本身。

我只是将其更改为一个字符串; MyXmlDocument.OuterXml;这样,一切都保持不变,没有问题。

+0

你指的是哪个“XML”标签? ''?这是一个处理指令,而不是一个标签。它不应该造成任何问题。是什么让你认为这是问题? – 2011-04-07 19:17:49

+1

再次,这不是一个标签,它是一个处理指令。请显示正在删除处理说明的服务操作的签名(功能标题)。有机会,它应该被删除,但让我们看看。 – 2011-04-07 19:46:47

+0

@约翰桑德斯 - 不是一个PI,虽然它看起来像一个。参见[http://www.developerfusion。“XML声明是一个处理指令?”下的“com/samplechapter/1704/beginning-xml/10 /”) XML规范清楚地显示了XML声明[http://www.w3.org/TR/2008/REC-xml-20081126/#NT-XMLDecl]和处理指令[http://www.w3。 org/TR/2008/REC-xml-20081126 /#sec-pi] – lavinio 2011-04-07 19:52:53

回答

2

这很可能是一个编码问题。 XML声明声明文档是UTF-16,每个字符两个字节。另一个图书馆可能会假设,如果没有其他编码的话。

+0

我认为这就是为什么指令丢失时库失败。 – David 2011-04-07 20:00:36

0

您将永远不会收到通过XmlNode,XmlElementXmlDocument参数传递给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