marshall with xjc创建了嵌套类

时间:2012-11-16 10:11:06

标签: java jaxb xjc

<ProductInformation Context="GL">
 <Assets>
  <Asset ID="assetID" UserTypeID="ID">
    <Name>name</Name>
    <Reference ClassificationID="id"/>
      <Values>
        <Value AttributeID="ID">Value1</Value>
        <Value AttributeID="ID">Value2</Value>
          <MultiValue AttributeID="attributeID">
             <Value>value3a</Value>
             <Value>value3b</Value>
          </MultiValue>
     </Values>
   </Asset>
 </Assets>

 <Products>....</Products>

</ProductInformation>

我使用xml-&gt; xsd和xjc从中创建类。

现在我想创建我的ProductInformation对象,然后对其进行编组。

我的问题是xjc创建3个类和一个objectfactory,以及ProductInformation中的一些嵌套类。当我看到可用的方法时,我主要看到的是getter而不是setter。

“资产”类没有像这样的方法;

asset.setValues(List<Value> values)

此外,我最终写出了这样有趣的代码;

ProductInformation.Assets.Asset.Values.MultiValue multivalue=new ProductInformation.Assets.Asset.Values.MultiValue();

Jaxb这是正常的吗?

3 个答案:

答案 0 :(得分:5)

JAXB通常处理多值属性的方式是为List<Whatever>提供一个getter而不是setter,它返回一个可变列表 - 你应该调用getter来检索一个初始为空的列表,然后以正常方式使用new创建此列表的成员对象,并将add直接创建到列表中。您可以new静态嵌套类与顶级类完全相同。

应该使用getter和setter生成单值属性(非列表)。

答案 1 :(得分:5)

answer given by Ian Roberts是正确的。我正在给这个人提供一些额外的信息给那些对没有内部课程感兴趣的人。

XML架构(schema.xsd)

如果JAXB类是从以下XML模式生成的,则生成的CustomerEmployee类都将包含一个名为Address的静态嵌套类(因为每个类都包含它们自己的定义地址)。这实际上是为什么使用静态嵌套类来避免名称冲突问题。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
    targetNamespace="http://www.example.org/company"
    xmlns="http://www.example.org/company"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"> 

    <xsd:element name="customer">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="address">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="street" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="employee">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="address">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="road" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

JAXB绑定文件(binding.xml)

绑定文件用于自定义Java生成的架构。您可以指定所有内容都应该是localScoping="top-level"的顶级课程。执行此操作时,您必须确保解决任何潜在的名称冲突。

<jaxb:bindings
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jaxb:globalBindings localScoping="toplevel"/>
    <jaxb:bindings schemaLocation="company.xsd">
        <jaxb:bindings node="//xsd:element[@name='employee']/xsd:complexType/xsd:sequence/xsd:element[@name='address']/xsd:complexType">
            <jaxb:class name="EmployeeAddress"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

XJC致电

下面是使用XJC命令从XML模式生成Java类时指定绑定文件的示例。

xjc -b binding.xml schema.xsd

了解更多信息

答案 2 :(得分:0)

这实际上只是对Blaise Doughan答案的评论,但我想发布xml。

如果您使用的是复杂的xsd,并且var midPoints; getMidPoint(Location1, Location2, function(error,data){ // You can check for error here midPoints = data; }) // Directions API var i = 0; var array = []; function getMidPoint(a, b, callback) { console.log("I am working...") clientMap.post(config_KEYS.DIRECTION_API + a + "&destination=" + b + "&key=" + config_KEYS.GOOGLE_API_KEY + "&departure_time=" + timeStamp + "", function (googleDirectionData, error) { if (googleDirectionData.status == "ZERO_RESULTS" | googleDirectionData.status == "INVALID_REQUEST") { res.status(400).send(googleDirectionData) } else { var polyline = googleDirectionData.routes[0].overview_polyline.points var decoded = decode(polyline) var n = Math.round(decoded.length / 2) var obj = {} obj.latitude = decoded[n].latitude obj.longitude = decoded[n].longitude array.push(obj) callback(null, array); } }) } 属性中的路径太长,则可以:

node