java - 使用 xjc 编码创建嵌套类

标签 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->xsd 和 xjc 从它创建类。

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

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

“ Assets ”类没有这样的方法;

asset.setValues(List<Value> values)

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

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

这对 Jaxb 来说正常吗?

最佳答案

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 绑定(bind)文件 (binding.xml)

绑定(bind)文件用于自定义 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 命令从 XML 模式生成 Java 类时指定绑定(bind)文件的示例。

xjc -b binding.xml schema.xsd

了解更多信息

关于java - 使用 xjc 编码创建嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13414407/

相关文章:

java - 如何禁用motionLayout过渡?

java - 为 Junit 测试包装多行字符串

java - Apache CXF JAXB Marshaller 未正确编码 @XmlAttribute

java - 如何使用 gradle-jaxb-plugin 的 jaxb 插件扩展

java - 我如何编写我的模式,以便将序列中的元素映射到单独的属性,而不是 JAXB 生成的类中的一个 List<Object>?

java - 更新 JavaFX 阶段的大小和位置不起作用

java - Jasper 报告 - 如何更改 xpath 执行器工厂

java - 我可以用代码替换 jaxb.properties 吗?

java - glassfish 的 JAXB XJC 编译器引用实现的任何替代方案?

maven - 将 XJB 与 jaxb2-maven-plugin 一起使用