преобразование смеси XML / XSD / WSDL в класс java - PullRequest
0 голосов
/ 04 мая 2020

У меня есть один протокол (onvif), который использует сочетание между определением .xsd для своего сервиса в SOAP и определением класса Dynami c (XML) для внутренней системы событий.

Система работает следующим образом:

  1. Протокол определяется файлами wsdl
  2. Существует WS-BaseNotification для получения события
  3. Определение события не предвидится внутри файла wsdl, но его можно получить с помощью запроса к службе.

Файлы определения .wsdl присутствуют на этом сайте

Когда я запрашиваю на устройство (через систему WS-BaseNotification) я получаю описания событий, как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
    xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
    xmlns:wsa5="http://www.w3.org/2005/08/addressing"
    xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2"
    xmlns:wstop="http://docs.oasis-open.org/wsn/t-1"
    xmlns:tt="http://www.onvif.org/ver10/schema"
    xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2"
    xmlns:tev1="http://www.onvif.org/ver10/events/wsdl/NotificationProducerBinding"
    xmlns:tev2="http://www.onvif.org/ver10/events/wsdl/EventBinding"
    xmlns:tev3="http://www.onvif.org/ver10/events/wsdl/SubscriptionManagerBinding"
    xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
    xmlns:tev4="http://www.onvif.org/ver10/events/wsdl/PullPointSubscriptionBinding"
    xmlns:tev="http://www.onvif.org/ver10/events/wsdl"
    xmlns:tns1="http://www.onvif.org/ver10/topics"
    xmlns:tnsaxis="http://www.axis.com/2009/event/topics"
    xmlns:ter="http://www.onvif.org/ver10/error"
    xmlns:pt="http://www.onvif.org/ver10/pacs"
    xmlns:tdc="http://www.onvif.org/ver10/doorcontrol/wsdl"
    xmlns:tac="http://www.onvif.org/ver10/accesscontrol/wsdl">
    <SOAP-ENV:Header>
        <wsa5:RelatesTo>urn:uuid:885a71ab-e227-40c9-8471-7b92616cd959</wsa5:RelatesTo>
        <wsa5:To SOAP-ENV:mustUnderstand="true">http://www.w3.org/2005/08/addressing/anonymous</wsa5:To>
        <wsa5:Action SOAP-ENV:mustUnderstand="true">http://www.onvif.org/ver10/events/wsdl/EventPortType/GetEventPropertiesResponse</wsa5:Action>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <tev:GetEventPropertiesResponse>
            <tev:TopicNamespaceLocation>http://www.onvif.org/onvif/ver10/topics/topicns.xml</tev:TopicNamespaceLocation>
            <wsnt:FixedTopicSet>false</wsnt:FixedTopicSet>
            <wstop:TopicSet>
                <tns1:AccessPoint>
                    <State>
                        <Enabled wstop:topic="true">
                            <tt:MessageDescription IsProperty="true">
                                <tt:Source>
                                    <tt:SimpleItemDescription Name="Device Source" Type="xsd:string"></tt:SimpleItemDescription>
                                    <tt:SimpleItemDescription Name="AccessPointToken" Type="pt:ReferenceToken"></tt:SimpleItemDescription>
                                </tt:Source>
                                <tt:Data>
                                    <tt:SimpleItemDescription Name="State" Type="xsd:boolean"></tt:SimpleItemDescription>
                                </tt:Data>
                            </tt:MessageDescription>
                        </Enabled>
                    </State>
                </tns1:AccessPoint>
            </wstop:TopicSet>
            <wsnt:TopicExpressionDialect>http://www.onvif.org/ver10/tev/topicExpression/ConcreteSet</wsnt:TopicExpressionDialect>
            <wsnt:TopicExpressionDialect>http://docs.oasis-open.org/wsn/t-1/TopicExpression/Concrete</wsnt:TopicExpressionDialect>
            <tev:MessageContentFilterDialect>http://www.onvif.org/ver10/tev/messageContentFilter/ItemFilter</tev:MessageContentFilterDialect>
            <tev:MessageContentSchemaLocation>http://www.onvif.org/ver10/schema/onvif.xsd</tev:MessageContentSchemaLocation>
        </tev:GetEventPropertiesResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Моя задача - создать класс. java для каждого события (есть много событий), Очевидно, я могу жестко закодировать каждое событие или кодировать себя как парсер, но я почти уверен, что есть автоматический способ генерирования их из XML.

Мои попытки всегда терпели неудачу с JAXB, потому что пространство имен где не разрешен редактор И я понятия не имею, может ли jaxb смешать определение .wsdl / .xsd и xml для генерации. java

Спасибо

Обратите внимание, что эта проблема связана с этим другой поток , но сосредоточиться только на генерации. java из XML.

1 Ответ

1 голос
/ 12 мая 2020

Мой объект - создать. java класс для каждого события (есть много событий)

Вам нужно получить описание схемы XML для каждого событие, а затем сгенерируйте классы java, используя JAXB. Для этого может потребоваться извлечь WSDL для каждого типа события и извлечь из него определения XSD. Я ожидаю, что этот шаг может быть записан в сценарий, если у вас есть много типов событий для обработки.

Я уверен, что есть автоматический способ генерирования их из XML.

В общем, опасно это предполагать. Один XML документ является лишь одним примером действительного документа. Определение типа реального события может содержать дополнительные элементы, которых нет в ваших примерах. Единственный безопасный способ сделать это (если вы не уверены на 100%, что события содержат нет необязательных элементов) - это получить WSDL / XSD для каждого типа события.

My try всегда терпел неудачу с JAXB, потому что пространство имен там, где оно не разрешено.

XML пространства имен не сложно понять, поэтому это должно быть легко исправить. Не стесняйтесь задавать конкретные c вопросы об ошибках, если вы действительно не можете их понять.

Я понятия не имею, может ли jaxb смешать определение .wsdl / .xsd и xml для генерации . java

Basi c JAXB работает с XSD, а не с WSDL. Однако существует множество инструментов, которые могут генерировать привязки Java из определения WSDL. Все они используют JAXB для создания классов Java из части XSD. Вам следует изучить эти варианты, прежде чем искать решения с ручным кодированием.

...