我有一大块XML看起来像这样:
<transaction name="transaction_A">
<request>
<list name="listOfArgs">
<arg name="start" type="time"/>
<arg name="stop" type="time"/>
<arg name="user" type="user"/>
</list>
<arg name="are-new" type="boolean"/>
<arg name="number-of-references" type="positive small number"/>
</request>
<response>
<arg name="would-cause-conflicts" type="boolean"/>
<arg name="number-of-conflicts" type="positive number"/>
</response>
</transaction>
<transaction name="transaction_B">
<response>
<list name="availability">
<arg name="start-hour" type="positive small number"/>
<arg name="stop-hour" type="positive small number"/>
<arg name="is-override" type="boolean"/>
<arg name="is-allocated" type="boolean"/>
</list>
</response>
</transaction>
<transaction name="transaction_C">
<request>
<arg name="reference-type"/>
<arg name="reference-number"/>
</request>
</transaction>
我可以将其转换为XSD ...
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="all">
<xs:complexType>
<xs:sequence>
<xs:element name="transaction" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="request" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="list" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="arg" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="type" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="name"/>
</xs:complexType>
</xs:element>
<xs:element name="arg" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="type" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="response" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="arg" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="type" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="list" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="arg" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="type" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="name"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="name" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
但它不是很有用,因为“arg”元素是如此通用。我的最终目标是创建Java对象来表示每个唯一的请求和响应元素。我需要能够区分transaction_A
与transaction_B
的请求。
我的想法是使用XSLT到transform the attributes into child elements,然后从新的XML创建一个新的XSD。从那个XSD我可以使用JiBX或其他工具创建我的Java对象。然而,关于这一点似乎并不是最好的解决方案。
问题: 将XML上面的XML转换为有用的Java对象的最佳方法是什么,使用XML中的属性值作为字段名称(或者甚至是事务元素中的类名)。