将 XML/XSD/WSDL 的混合转换为 java class

converting a mix of XML/XSD/WSDL to java class

我有一个协议 (onvif),他混合使用 .xsd SOAP 服务定义和内部事件的动态 class 定义 (XML)系统.

系统工作如下:

  1. 协议由 wsdl 文件定义
  2. 有一个用于接收事件的 WS-BaseNotification
  3. 事件定义不在 wsdl 文件中,但可以通过服务请求获取。

.wsdl 定义文件存在于 this site

当我向设备发出请求时(通过 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 class(有很多事件),我显然可以对每个事件进行硬编码,或者自己编写一个解析器,但我很漂亮确保有一种自动方法可以从 XML.

生成它们

我对 JAXB 的尝试总是失败,因为名称空间未解析。而且我不知道 jaxb 是否可以混合 .wsdl/.xsd 定义和 xml 来生成 .java

谢谢

请注意此问题与此 other thread 有关,但只关注从 XML.

生成 .java

My objectif is to create .java class to each event (there is a lots of event)

您需要掌握每个事件的 XML 架构描述,然后使用 JAXB 生成 java 类。这可能需要您获取每种事件类型的 WSDL 并从中提取 XSD 定义。如果您要处理许多事件类型,我希望可以编写该步骤的脚本。

I am pretty sure there is a automated way to generated them from the XML.

一般来说,这样假设是很危险的。单个 XML 文档只是有效文档的一个示例。真实事件类型定义可能包含示例中不存在的可选元素。执行此操作的唯一安全方法(除非您 100% 确定事件包含 no 可选元素)是为每个事件类型获取 WSDL/XSD。

My tries has always failed with JAXB, because the namespace where not resolved.

XML 命名空间并不难理解,所以这应该很容易解决。如果您确实无法理解错误,请随时提出有关错误的具体问题。

I have no idea if jaxb can mix the .wsdl/.xsd definition and xml to generate the .java

基本 JAXB 使用 XSDs,而不是 WSDL。但是,有许多工具可以从 WSDL 定义生成 Java 绑定。他们都在幕后使用 JAXB 从 XSD 部分生成 Java 类。在寻找手动编码的解决方案之前,您应该探索这些选项。