我正在使用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
...
我能解决什么问题?
答案 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的关联,然后在对象的序列化过程中使用它们。
希望这有帮助,