使用名称空间的服务来使用SOAP

时间:2010-02-05 10:36:14

标签: c# web-services serialization soap

我正在使用SOAP Web服务,它有名称空间,有些类似于:

<?xml version="1.0" encoding="UTF-8" ?>   
<wsdl:definitions targetNamespace="http://www.company.com/" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:company="http://www.company.com/" 
    xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
  <wsdl:types>
    <xsd:schema elementFormDefault="qualified" targetNamespace="http://www.company.com/" version="0.1" 
    xmlns:cmp="http://www.company.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:element name="Number" type="cmp:NumberType" />

我的问题是.net序列化对象时它不包含xml中的前缀cmp。它呈现<Number ....而不是<cmp:Number ...

我能解决什么问题?

3 个答案:

答案 0 :(得分:0)

发送该请求后会发生什么?推测它成功了,因为

cmp:NumberType部分
<xsd:element name="Number" type="cmp:NumberType" />

不是指元素的名称,而是指上面引用的WSDL中的类型名称。它是一个复杂的类型,否则就像xsd:int。因此,正如我所说,您的代码应该仍然有效,特别是如果您将WSDL作为WebReference导入到Visual Studio项目中。

答案 1 :(得分:0)

我最近听说过区分

的程序
<Number xmlns="http://www.company.com/" />

<tns:Number xmlns:tns="http://www.company.com/" />

这两个例子在XML标准方面是相同的,但有些程序不符合标准,而是创建自己的标准。

您可以发布导致问题的XML吗?另外,发布收到的完整错误消息。

答案 2 :(得分:0)

元素上使用的前缀仅在前缀声明的范围内有效。换句话说,这个'cmp'前缀仅对此序列化XML有效。

前缀只不过是它所代表的命名空间的缩写。在这种情况下,“cmp”代表{http://www.company.com/}。

当您将此XML加载到DOM文档中时,此DOM中的节点的“真实声明”现在为“{http://www.company.com/}:Number”。

这甚至是一个非常短的命名空间,想象一下平均命名空间及其大小,我认为我们可以同意为什么在序列化任何XML文档时使用缩写(在XML中称为前缀)是一个好主意。

但是你序列化它,它不会改变它代表的数据。所以

<bla xmlns="http://www.company.com/" /> 

在语法上是不同的,但在价值方面与

相同
<cmp:bla xmlns:cmp="http://www.company.com/" /> 
<{http://www.company.com/}:bla /> 

读完之后,实际上是否需要以使用“cmp”作为前缀的格式提供序列化XML? (因为它是一个soap标题,我认为这个要求不存在),或者我们可以使用任何xml序列化样式,只要我们不更改它代表的数据? (这是W3C XML 1.0 + Namespaces兼容解析器所关心的)

如果不是要求,请不要让它成为一个:)

如果是要求;

您可以将XmlNamespaceManager与XmlSerializer相关联。这允许您设置前缀到namespaceuri的关联,然后在对象的序列化过程中使用它们。

希望这有帮助,

相关问题