SOAPUI SOAP Mocking error: префикс не может начинаться с XML: XMLSchema-instance - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь смоделировать некоторые сценарии для API Vmware vSphere Vcenter SOAP (VMware-vSphereSDK-6.5.0, загруженный здесь: https://my.vmware.com/web/vmware/details?productId=614&downloadGroup=VS-MGMT-SDK65).

Я мог бы смоделировать несколько операций API, пока не столкнулся спроблема, поскольку WSDL ссылается на пространство имен, которое генерирует ошибку, по-видимому, из-за следующего оператора:

<selectSet XMLSchema-instance:type="TraversalSpec" xmlns:XMLSchema-instance="http://www.w3.org/2001/XMLSchema-instance">

Вот исключение, выданное

ERROR:com.eviware.soapui.impl.wsdl.mock.DispatchException:   org.apache.xmlbeans.XmlException: error: Prefix can't begin with XML: XMLSchema-instance
   com.eviware.soapui.impl.wsdl.mock.DispatchException: org.apache.xmlbeans.XmlException: error: Prefix can't begin with XML: XMLSchema-instance
at com.eviware.soapui.impl.wsdl.mock.WsdlMockDispatcher.dispatchPostRequest(WsdlMockDispatcher.java:242)
at com.eviware.soapui.impl.wsdl.mock.WsdlMockDispatcher.dispatchRequest(WsdlMockDispatcher.java:114)
at com.eviware.soapui.impl.wsdl.mock.WsdlMockRunner.dispatchRequest(WsdlMockRunner.java:144)
at com.eviware.soapui.monitor.JettyMockEngine$ServerHandler.handle(JettyMockEngine.java:604)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:713)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.xmlbeans.XmlException: error: Prefix can't begin with XML: XMLSchema-instance
at org.apache.xmlbeans.impl.store.Locale$SaxLoader.load(Locale.java:3474)
at org.apache.xmlbeans.impl.store.Locale.parse(Locale.java:712)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:696)
at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:683)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:208)
at org.apache.xmlbeans.XmlObject$Factory.parse(XmlObject.java:633)
at com.eviware.soapui.support.xml.XmlUtils.createXmlObject(XmlUtils.java:183)
at com.eviware.soapui.impl.support.AbstractMockRequest.getRequestXmlObject(AbstractMockRequest.java:297)
at com.eviware.soapui.impl.wsdl.mock.WsdlMockDispatcher.dispatchPostRequest(WsdlMockDispatcher.java:193)
... 16 more

Вот полное телозапрос на работу API, который не работает на SOAP UI (и, очевидно, работает на vSphere):

'<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
    <RetrieveProperties xmlns="urn:vim25">
        <_this type="PropertyCollector">propertyCollector</_this>
        <specSet>
            <propSet>
                <type>Folder</type>
                <pathSet>name</pathSet>
                <pathSet>childType</pathSet>
            </propSet>
            <propSet>
                <type>Datacenter</type>
                <pathSet>name</pathSet>
            </propSet>
            <propSet>
                <type>VirtualMachine</type>
                <pathSet>name</pathSet>
            </propSet>
            <propSet>
                <type>Network</type>
                <pathSet>name</pathSet>
            </propSet>
            <propSet>
                <type>ComputeResource</type>
                <pathSet>name</pathSet>
                <pathSet>resourcePool</pathSet>
            </propSet>
            <propSet>
                <type>ClusterComputeResource</type>
                <pathSet>name</pathSet>
                <pathSet>resourcePool</pathSet>
            </propSet>
            <propSet>
                <type>Datastore</type>
                <pathSet>name</pathSet>
            </propSet>
            <objectSet>
                <obj type="Folder">group-d1</obj>
                <skip>true</skip>
                <selectSet XMLSchema-instance:type="TraversalSpec" xmlns:XMLSchema-instance="http://www.w3.org/2001/XMLSchema-instance">
                    <type>Folder</type>
                    <path>childEntity</path>
                    <skip>false</skip>
                </selectSet>
            </objectSet>
        </specSet>
    </RetrieveProperties>
</Body>

Я считаю, что это интерпретация спецификаций XML, связанных с проверкой xmlправильный синтаксис пространства имен, который обсуждался и, по-видимому, был исправлен в этом отчете об ошибке (в контексте jdom): https://github.com/hunterhacker/jdom/issues/126

Действительно, в своих API, vmware люди ссылаются на пространство имен, начинающееся с XML (XMLSchema-Instance) ивозможно, не стоит (мне не хватает эксперта по XML, чтобы судить), но спецификации https://www.w3.org/TR/REC-xml-names/#xmlReserved, кажется, ясно говорят, что это НЕ ДОЛЖНО рассматриваться как ошибка.

Любая идеяКак обойти (или исправить) эту проблему, можно только приветствовать.Огромное спасибо.

1 Ответ

0 голосов
/ 03 февраля 2019

В первом издании рекомендации пространств имен XML просто сказано, что префиксы, начинающиеся с «xml», были зарезервированы для использования в будущих спецификациях;в нем не сказано, что должны делать парсеры, если встречаются такие префиксы.

Некоторые продукты интерпретируют правило, отклоняя документы, содержащие такой префикс.Это поставило бы в тупик намерение их зарезервировать, потому что если бы любой новый стандарт принял такое имя, документы, использующие это имя, не работали бы со старым программным обеспечением.Поэтому во втором издании пространств имен XML было разъяснено, что означает это правило: приложения не должны использовать такие имена, но синтаксические анализаторы не должны отклонять их.

Но, конечно, это было слишком поздно;Программное обеспечение уже было с другой интерпретацией правил, и некоторые из них не были обновлены.

Как решить проблему?Вы должны либо изменить документ, либо изменить программное обеспечение.Я бы попробовал поместить документ через XSLT-преобразование, которое меняет префикс.

...