簡體   English   中英

將 XML/XSD/WSDL 的混合轉換為 java class

[英]converting a mix of XML/XSD/WSDL to java class

我有一個協議(onvif),他在 SOAP 中為他的服務使用 xsd 定義和內部事件系統的動態 class 定義(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 class 到每個事件(有很多事件),我顯然可以對每個事件進行硬編碼,或者自己編寫一個解析器,但我很確定有一種自動方法可以從 Z3501B7105D3638EDF 生成它們

我的嘗試總是以 JAXB 失敗,因為未解析的命名空間。 And I have no idea if jaxb can mix the.wsdl/.xsd definition and xml to generate the.java

謝謝

請注意,此問題與此其他線程有關,但僅關注從 XML 生成.java。

我的目標是為每個事件創建.java class(有很多事件)

您需要掌握每個事件的 XML Schema 描述,然后使用 JAXB 生成 java 類。 這可能需要您獲取每種事件類型的 WSDL 並從中提取 XSD 定義。 如果您要處理許多事件類型,我希望該步驟可以編寫腳本。

我很確定有一種從 XML 生成它們的自動化方法。

一般來說,假設是危險的。 單個 XML 文檔只是有效文檔的一個示例。 真實事件類型定義可能包含示例中不存在的可選元素。 唯一安全的方法(除非您 100% 確定事件包含可選元素)是獲取每種事件類型的 WSDL/XSD。

我的嘗試總是以 JAXB 失敗,因為未解析的命名空間。

XML 命名空間不難理解,所以這應該很容易解決。 如果您真的無法理解錯誤,請隨時詢問有關錯誤的具體問題。

我不知道 jaxb 是否可以混合 .wsdl/.xsd 定義和 xml 來生成 .33D11F725FFE48742

基本 JAXB 適用於 XSD,而不適用於 WSDL。 但是,有許多工具可以從 WSDL 定義生成 Java 綁定。 他們都使用 JAXB 來從 XSD 部分生成 Java 類。 在尋找手動編碼的解決方案之前,您應該探索這些選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM