将XMLXSDWSDL混合转换为java类。

问题描述 投票:0回答:1

我有一个protocole(onvif),他使用.xsd定义的SOAP服务和动态类定义(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

谢谢你

注意这个问题与此有关 别线 但只关注从XML中生成.java。

xml xsd jaxb wsdl
1个回答
1
投票

我的目标是为每个事件创建.java类(有很多事件)。

你需要掌握每个事件的 XML Schema 描述,然后使用 JAXB 生成 java 类。这可能需要你获取每个事件类型的WSDL并从中提取XSD定义。如果你有很多事件类型需要处理,我希望这一步可以用脚本来完成。

我确信有一种自动的方法可以从XML中生成它们。

一般来说,这样的假设是危险的。一个XML文档只是一个有效文档的例子。真正的事件类型定义可能包含你的例子中没有的可选元素。唯一安全的方法是(除非你100%确定事件中包含了 没有 可选元素)是为了获取每个事件类型的WSDLXSD。

我的尝试在JAXB中总是失败,因为没有解决命名空间的问题。

XML命名空间并不难理解,所以这应该很容易解决。如果实在看不懂错误,可以随时问具体问题。

我不知道jaxb是否可以将.wsdl.xsd定义和xml混合起来生成.java。

Basic JAXB 可以使用 XSD,而不是 WSDL,但有很多工具可以从 WSDL 定义中生成 Java 绑定。然而,有许多工具可以从 WSDL 定义生成 Java 绑定。它们都使用 JAXB 来从 XSD 部分生成 Java 类。在寻找手工编码的解决方案之前,你应该先探索这些选项。

© www.soinside.com 2019 - 2024. All rights reserved.