Использование SOAP с сервисом с пространством имен - PullRequest
0 голосов
/ 05 февраля 2010

Я использую веб-сервис SOAP, который имеет пространство имен, похожее на:

<?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 сериализует объект, который не включает префикс cmp в xml. Он отображает <Number .... вместо <cmp:Number ...

Что я могу решить?

Ответы [ 3 ]

0 голосов
/ 10 февраля 2010

Я недавно слышал о программах, которые различают

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

и

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

Эти два примера идентичны с точки зрения стандартов XML, но есть программы, которые не следуют стандартам, а вместо этого создают свои собственные стандарты.

Можете ли вы опубликовать XML, который вызывает проблему? Также опубликуйте полученное сообщение об ошибке.

0 голосов
/ 11 февраля 2010

Префикс, используемый для элемента, действителен только в рамках объявления префикса. Другими словами, этот префикс '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 /> 

После прочтения этого требования требуется ли предоставлять сериализованный XML в формате, в котором в качестве префикса используется "cmp"? (поскольку это мыльный заголовок, я думаю, что этого требования нет), или мы можем использовать ЛЮБОЙ стиль сериализации xml, если мы не изменяем данные, которые они представляют? (это то, о чем заботятся парсеры, совместимые с пространствами имен W3C XML 1.0 +)

Если это не requrement, давайте не будем делать это один:)

Если это требование;

Вы можете связать XmlNamespaceManager с XmlSerializer. Это позволяет вам устанавливать связи префикса с пространством имен, которые затем будут использоваться при сериализации объекта.

Надеюсь, это поможет,

0 голосов
/ 10 февраля 2010

Что происходит, когда вы отправляете этот запрос? Предположительно это удается, потому что cmp:NumberType часть

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

относится не к имени элемента, а к имени типа в WSDL, указанном выше. Это сложный тип, в противном случае это будет что-то вроде xsd:int. Итак, как я уже сказал, ваш код все еще должен работать, особенно если вы импортировали этот WSDL в качестве веб-ссылки в ваш проект Visual Studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...