свободная проверка xsd

Я звоню в веб-службу, и я хотел бы проверить ответ мыла с помощью проверки xsd. Я действительно не хочу выполнять строгую проверку xsd, я просто хочу знать, присутствует ли в ответе какой-либо элемент «История».

Таким образом, проверка xsd должна быть успешной, когда есть «Элемент истории», и завершаться ошибкой, когда этот элемент отсутствует. Я начал с xsd ниже. Я просто хочу расширить его своим обязательным элементом «История». Как я могу этого добиться?

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:ns="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
        targetNamespace="http://schemas.xmlsoap.org/soap/envelope/"
        elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xsd:element name="Envelope">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Мыльный ответ

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <p793:TuDetailsResponse xmlns:p793="http://gls-group.eu/Tracking/">
         <p793:History>
            <p793:Date>
               <p793:Year>2012</p793:Year>
               <p793:Month>10</p793:Month>
               <p793:Day>12</p793:Day>
               <p793:Hour>9</p793:Hour>
               <p793:Minut>52</p793:Minut>
            <p793:ReasonName/>
         </p793:History>
         <p793:History>
            <p793:Date>
               <p793:Year>2012</p793:Year>
               <p793:Month>10</p793:Month>
               <p793:Day>12</p793:Day>
               <p793:Hour>5</p793:Hour>
               <p793:Minut>45</p793:Minut>
            </p793:Date>
            <p793:ReasonName/>
         </p793:History>
      </p793:TuDetailsResponse>
   </soapenv:Body>
</soapenv:Envelope>

person samkaya    schedule 03.01.2013    source источник


Ответы (2)


Если вы сообщите валидатору XSD об элементах TuDetailsResponse и History, то, когда он увидит их в any, он должен использовать правила, определенные для их.

Main.xsd

Main.xsd

TuDetailsResponse.xsd

TuDetailsResponse.xsd

Main.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML Studio 2013 Designer Edition (Trial) 11.0.0.0 (http://www.liquid-technologies.com)-->
<xs:schema xmlns:ns0="http://gls-group.eu/Tracking/"
           elementFormDefault="qualified"
           targetNamespace="http://schemas.xmlsoap.org/soap/envelope/"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:import schemaLocation="C:\Temp\TuDetailsResponse.xsd"
               namespace="http://gls-group.eu/Tracking/" />
    <xs:element name="Envelope">
        <xs:complexType>
            <xs:sequence>
                <xs:any minOccurs="0"
                        maxOccurs="unbounded"
                        namespace="##any"
                        processContents="lax" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

TuDetailsResponse.xsd

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML Studio 2013 Designer Edition (Trial) 11.0.0.0 (http://www.liquid-technologies.com)-->
<xs:schema xmlns:tns="http://gls-group.eu/Tracking/"
           elementFormDefault="qualified"
           targetNamespace="http://gls-group.eu/Tracking/"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="TuDetailsResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="History"
                            maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:any minOccurs="0"
                                    maxOccurs="unbounded"
                                    namespace="##any" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Образец корректного XML-файла

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML Studio 2013 Designer Edition (Trial) 11.0.0.0 (http://www.liquid-technologies.com) -->
<Envelope xmlns:tns="http://gls-group.eu/Tracking/"
          xmlns="http://schemas.xmlsoap.org/soap/envelope/"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ Main.xsd">
    <Body>
        <tns:TuDetailsResponse>
            <tns:History></tns:History>
        </tns:TuDetailsResponse>
    </Body>
</Envelope>

Примечание Элемент Body может привести к созданию предупреждения.

Недопустимый XML

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML Studio 2013 Designer Edition (Trial) 11.0.0.0 (http://www.liquid-technologies.com) -->
<Envelope xmlns:tns="http://gls-group.eu/Tracking/"
          xmlns="http://schemas.xmlsoap.org/soap/envelope/"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ file:///C:/Temp/WSDL%20Sample.xsd">
    <Body>
        <tns:TuDetailsResponse>
        </tns:TuDetailsResponse>
    </Body>
</Envelope>

Генерирует ошибку

(9:11) Ошибка Элемент TuDetailsResponse в пространстве имен 'http://gls-group.eu/Tracking/» имеет неполное содержание. Ожидается список возможных элементов: «История» в пространстве имен «http://gls-group.eu/Tracking/< /а>'.

Но на самом деле вам следует использовать некоторую обертку для мыла, это должно проверить ответ на соответствие схеме в WSDL, а также правильно отсортировать все сообщения об ошибках. Существуют инструменты для создания оболочек SOAP для большинства платформ и языков.

Примечание. Проверка в этом примере выполнялась с использованием классов .Net.

person Sprotty    schedule 03.01.2013

Добавьте все свои обязательные объекты с их пространством имен в Hashmap/Map , при разборе ответа прочитайте объект один за другим и проверьте, присутствует ли объект на карте или нет.

person Sonal Patil    schedule 03.01.2013
comment
Я использую внешние инструменты для проверки ответа мыла с помощью xsd. Так что мне просто нужно иметь xsd, который я могу импортировать в свои инструменты. Таким образом, я не могу решить это программно. - person samkaya; 03.01.2013