XML-ответ Soap проверяется с помощью xsd-файла

Используя https://www.freeformatter.com/xml-validator-xsd.html

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

(Кстати, я хотел бы отметить, что этот wsdl и xsd не предоставляются на конечной точке, CISCO предоставляет zip-файл wsdl и xsd-файла). Затем вы можете отправлять запросы на сервер в соответствии с wsdl/xsd, и он будет работать. Но wsdl и xsd недоступны на cisco.com или в виртуальной машине или домене, на котором установлена ​​служба)

Это прекрасно работает в C#, если я указываю на файлы, но я хотел бы загрузить XML-документ в документ переменной NSXMLDocument, чтобы он указывал на свой собственный schemaFile и просто вызывал validate

У меня есть следующее мыло XML

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
<soapenv:Body>
<ns:getCCMVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5"><return><componentVersion>     
<version>10.5.2.11900(3)</version>
</componentVersion>
</return>
</ns:getCCMVersionResponse>
</soapenv:Body>
</soapenv:Envelope>

Я взял минимум из файла xsd, предоставленного cisco, и онлайн-инструмент работает с

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:axlapi="http://www.cisco.com/AXL/API/10.5" 
attributeFormDefault="unqualified" elementFormDefault="unqualified" 
targetNamespace="http://www.cisco.com/AXL/API/10.5" version="10.5">
 <xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
  <xsd:complexType name="GetCCMVersionRes">
    <xsd:complexContent>
        <xsd:extension base="axlapi:APIResponse">
            <xsd:sequence>
                <xsd:element name="return">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="componentVersion">
                                <xsd:complexType>
                                    <xsd:sequence>
                                        <xsd:element name="version" type="axlapi:String50"/>
                                    </xsd:sequence>
                                </xsd:complexType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>
<xsd:element name="getCCMVersionResponse" type="axlapi:GetCCMVersionRes"/>
    <xsd:simpleType name="String50">
    <xsd:restriction base="xsd:string">
        <xsd:maxLength value="50"/>
    </xsd:restriction>
</xsd:simpleType>
<xsd:complexType abstract="true" name="APIResponse">
    <xsd:annotation>
        <xsd:documentation>All responses must extend abstractResponse.</xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="sequence" type="xsd:unsignedLong" use="optional"/>
</xsd:complexType>
</xsd:schema>

Обратите внимание, я должен был добавить ниже в xsd-файл, чтобы избежать ошибки SOAP

<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>

И это работает в онлайн-инструменте

Теперь это здорово и все для онлайн-инструмента, но я хотел бы проверить сам документ. Это делается (если вы читаете онлайн-инструмент), добавляя к элементу конверта запроса Soap "noNamespaceSchemaLocation" или "schemaLocation" и http-путь к файлу xsd (или частичному файлу, который я создал выше)

Я испробовал все виды способов с помощью онлайн-инструмента, и он никогда не будет проверять. в настоящее время он размещен по адресу http://test123a.epizy.com/getCCMVersion.xsd (я надеюсь, что это не потому, что это бесплатный хост, с которым у меня возникли проблемы), но также должны быть способы сделать это с помощью файла:///

Я использую macOS и target-c, но весь код выполняет манипуляции с заголовком ответа soap xml и помещает местоположение файла:///. Я также пробовал http: //.

Кто-нибудь может разгадать эту абсолютную тайну? Это кажется таким простым и понятным из некоторых примеров в Интернете....

Проверить схему XML с помощью файла xsd в Какао?

http://answerqueen.com/2j/q7vz0zv32j

Как исправить soapenv: проблема с конвертом в схеме XSD при проверке с запросом / ответом SOAP

https://code.i-harness.com/en/q/8bfd7

Как правильно ссылаться на локальный файл XML-схемы?

Cvc-elt.1: не удается найти объявление элемента "мыло: конверт"

Спасибо за вашу помощь заранее

этот парень не получил ответа SOAP Response Schema Validation

1 ответ

Решение

Оказывается, вы можете подтвердить только один или другой. Вы не можете загрузить ответ мыла и проверить мыло и XML внутри него за один вызов. Вы можете отделить мыло и XML и проверить отдельно.

Вот правильный код для этого

<?xml version='1.0' encoding='UTF-8'?>"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getCCMVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5"                                                       
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                                              
xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5  
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
<return>
<componentVersion>
<version>10.5.2.11900(3)</version>
</componentVersion>
</return>
</ns:getCCMVersionResponse>
</soapenv:Body>

Вы не можете проверить SOAP и XML внутри одновременно. Вам нужно будет использовать xpath, чтобы добраться до xml и проверить, так как проверка мыла не так важна.

Что было интересного в XML

Я не смог использовать xsi:noNameSpaceSchemaLocation="file:///Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">

как в xml xsi: schemaLocation = "http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd "> уже упоминается как пространство имен схемы

Таким образом, альтернативу пришлось использовать выше.

Кроме того, мне пришлось отредактировать файл схемы, чтобы исправить некоторые проблемы с пространством имен, в соответствии с xml-ответом xmlns:ns="http://www.cisco.com/AXL/API/10.5", ns - это пространство имен,

Но в файле схемы это ссылки как axlapi, все ссылки были изменены на ns

Надеюсь, это поможет кому-нибудь в будущем. К вашему сведению, указание всего файла AXLSoap.xsd для проверки заняло несколько минут, и его пришлось отказаться

Оказывается, вы можете подтвердить только один или другой. Вы не можете загрузить ответ мыла и проверить мыло и XML внутри него за один вызов. Вы можете отделить мыло и XML и проверить отдельно.

Вот правильный код для этого

<?xml version='1.0' encoding='UTF-8'?>"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getCCMVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5"                                                       
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                                              
xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5  
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
<return>
<componentVersion>
<version>10.5.2.11900(3)</version>
</componentVersion>
</return>
</ns:getCCMVersionResponse>
</soapenv:Body>

Вы не можете проверить SOAP и XML внутри одновременно. Вам нужно будет использовать xpath, чтобы добраться до xml и проверить, так как проверка мыла не так важна.

Что было интересного в XML

Я не смог использовать xsi:noNameSpaceSchemaLocation="file:///Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">

как в xml xsi: schemaLocation = "http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd "> уже упоминается как пространство имен схемы

Таким образом, альтернативу пришлось использовать выше.

Кроме того, мне пришлось отредактировать файл схемы, чтобы исправить некоторые проблемы с пространством имен, в соответствии с xml-ответом xmlns:ns="http://www.cisco.com/AXL/API/10.5", ns - это пространство имен,

Но в файле схемы это ссылки как axlapi, все ссылки были изменены на ns

Надеюсь, это поможет кому-нибудь в будущем. К вашему сведению, указание всего файла AXLSoap.xsd для проверки заняло несколько минут, и его пришлось отказаться

Последняя цель-c NSXMLDocument функция, чтобы обрабатывать или проверку мыла или XML здесь.

    BOOL validateDocumentUsingXMLSchemaAtPath( NSXMLDocument *doc, 
NSString* xsdPath, NSString *schemaNameSpace )
{
    BOOL validationResult = NO;  // Default to failing validation.

    // Get the root of the document.
    NSXMLElement *rootElement = [doc rootElement];

    // Add the XMLSchema-instance namespace, if it doesn't already exist
    NSXMLNode *namespace = [NSXMLNode namespaceWithName:@"xsi"
                                        stringValue:@"http://www.w3.org/2001/XMLSchema-instance"];
    [rootElement addNamespace:namespace];

    // Add the No Namespace Schema Location attribute referencing the local XSD file, and associate the XML Schema for validation.
    NSURL *xsdURL = [NSURL fileURLWithPath:xsdPath];

    NSString *schemaLocation = nil;
    if ( namespace == nil )
    {
        schemaLocation = @"noNamespaceSchemaLocation";
        schemaNameSpace = @"";
    }
    else
    {
        schemaLocation = @"schemaLocation";
    }

    NSString *schemaSpace = [NSString stringWithFormat:@"%@%@%@", schemaNameSpace, ([schemaNameSpace length] > 0) ? @" " : @"", [xsdURL description]];

NSXMLNode *schemaAttribute = [NSXMLNode attributeWithName:[NSString stringWithFormat:@"xsi:%@", schemaLocation]
                                                    stringValue:schemaSpace];
    [rootElement addAttribute:schemaAttribute];

    // Validate the document
    NSError *error = nil;
    validationResult = [doc validateAndReturnError:&error];

    if ( !validationResult )
         NSLog( @" %@", [error localizedDescription] );

    return validationResult;
    }


//usage
//find your soap, or xml document and put it in xmlDoc
               BOOL ret = validateDocumentUsingXMLSchemaAtPath(xmlDoc,xsdURL, @"http://www.cisco.com/AXL/API/10.5");
Другие вопросы по тегам