<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 模式生成的,则生成的 Customer
和 Employee
类都将包含一个名为 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/