将 XML/XSD/WSDL 的混合转换为 java class
converting a mix of XML/XSD/WSDL to java class
我有一个协议 (onvif),他混合使用 .xsd SOAP 服务定义和内部事件的动态 class 定义 (XML)系统.
系统工作如下:
- 协议由 wsdl 文件定义
- 有一个用于接收事件的 WS-BaseNotification
- 事件定义不在 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 类。在寻找手动编码的解决方案之前,您应该探索这些选项。
我有一个协议 (onvif),他混合使用 .xsd SOAP 服务定义和内部事件的动态 class 定义 (XML)系统.
系统工作如下:
- 协议由 wsdl 文件定义
- 有一个用于接收事件的 WS-BaseNotification
- 事件定义不在 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.
生成 .javaMy 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 类。在寻找手动编码的解决方案之前,您应该探索这些选项。