将XML属性转换为Java字段

时间:2012-06-20 21:57:04

标签: java xml xsd jibx xml-binding

我有一大块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_Atransaction_B的请求。

我的想法是使用XSLT到transform the attributes into child elements,然后从新的XML创建一个新的XSD。从那个XSD我可以使用JiBX或其他工具创建我的Java对象。然而,关于这一点似乎并不是最好的解决方案。

问题: 将XML上面的XML转换为有用的Java对象的最佳方法是什么,使用XML中的属性值作为字段名称(或者甚至是事务元素中的类名)。

0 个答案:

没有答案