marshall with xjc创建了嵌套类

Spr*_*ing 7 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>
Run Code Online (Sandbox Code Playgroud)

我使用xml-> xsd和xjc从中创建类.

现在我想创建我的ProductInformation对象,并对其进行编组.

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

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

asset.setValues(List<Value> values)
Run Code Online (Sandbox Code Playgroud)

我最后写了这样有趣的代码;

ProductInformation.Assets.Asset.Values.MultiValue multivalue=new ProductInformation.Assets.Asset.Values.MultiValue();
Run Code Online (Sandbox Code Playgroud)

Jaxb这是正常的吗?

Ian*_*rts 5

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

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

  • @Spring它使用静态嵌套类来避免名称冲突,如果两个不同的类型都具有不同的具有相同名称的嵌套元素. (2认同)
  • @Spring - 如果您希望所有内容都是顶级课程,请参阅:http://blog.bdoughan.com/2011/07/jaxb-xjc-and-nested-classes.html (2认同)

bdo*_*han 5

伊恩罗伯茨给出答案是正确的.我正在给这个人提供一些额外的信息给那些对没有内部课程感兴趣的人.

XML Schema(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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

XJC电话

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

xjc -b binding.xml schema.xsd
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息