2013-06-26 3 views
1

Моя схема является:Тип элемента (длинный) без содержания

<xsd:element name="SetMonitor"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="period" type="xsd:long" /> 
      <xsd:element name="refreshrate" type="xsd:long" /> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

И мой XML будет:

Случай 1.

<SetMonitor 
    xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:cb="http://schemas.cordys.com/1.0/coboc"> 
    <period/> 
    <refreshrate/> 
</SetMonitor> 

ИЛИ Случай 2.

<SetMonitor 
     xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:cb="http://schemas.cordys.com/1.0/coboc"> 
     <period>10</period> 
     <refreshrate>20</refreshrate> 
    </SetMonitor> 

Для случай 2 нет никаких проблем. Но для случае 1 я получаю следующее сообщение об ошибке:

Caused by: org.xml.sax.SAXException: cvc-datatype-valid.1.2.1: '' is not a valid value for 'integer'. 
org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 14; cvc-datatype-valid.1.2.1: '' is not a valid value for 'integer'. 

Как я могу изменить WSDL-так, что он принимает и случая 1 и случая 2? Пожалуйста, помогите.

ответ

0

Вы могли бы сделать что-то вроде этого:

<xsd:element name="SetMonitor"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="period" type="xsd:long" nillable="true"/> 
       <xsd:element name="refreshrate" type="xsd:long" nillable="true"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 

И построить XML с «пустым» элементом таким образом

<SetMonitor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <period>2147483647</period> 
    <refreshrate xsi:nil="true" /> 
</SetMonitor> 

Или вы можете изменить тип элемента, используя шаблон, что-то вроде этого

<xsd:element name="period"> 
    <xsd:simpleType> 
     <xsd:restriction base="xsd:string"> 
      <xsd:pattern value="|([1-9][0-9]*)" /> 
     </xsd:restriction> 
    </xsd:simpleType> 
</xsd:element> 

(шаблон должен быть определен более точно, чем для этого примера)

Другая возможность могла бы определить simpleType для пустой строки

<xsd:simpleType name="emptyString"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:length value="0"/> 
    </xsd:restriction> 
</xsd:simpleType> 

, а затем определить свой элемент в виде объединения XSD: длинный и тип emptyString

<xsd:element name="period"> 
    <xsd:simpleType> 
     <xsd:union memberTypes="xsd:long emptyString"/> 
    </xsd:simpleType> 
</xsd:element> 
+0

Я попытался модифицировать WSDL, как упоминалось выше (один сверху). Но я столкнулся с новой проблемой, что-то вроде 'Caused by: org.xml.sax.SAXException: cvc-complex-type.2.4.b: Содержимое элемента 'cb: SetMonitor' не завершено. Ожидается одно из {{http://schemas.cordys.com/1.0/coboc":period} '). org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 3; cvc-complex-type.2.4.b: Содержимое элемента 'cb: SetMonitor' не является полным. Предполагается одно из {{http://schemas.cordys.com/1.0/coboc":period} ". И если я поставлю moiOccurs = '0' для ** периода ** и ** refreshrate **, то это работает. – Ramesh

+0

Это означает, что '' из xml не отображает ''. – Ramesh

+0

'minOccurs =" 0 "' означает необязательный элемент (его можно опустить). 'nillable =" true "означает, что по-прежнему требуется иметь этот элемент в xml, но вы можете пометить его как' xsi: nil = "true" '(что-то вроде« null »на других языках) –