我有一个protocole(onvif),他使用.xsd定义的SOAP服务和动态类定义(XML)的内部事件系统的混合。
该系统的工作原理如下。
.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。
我的目标是为每个事件创建.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 类。在寻找手工编码的解决方案之前,你应该先探索这些选项。