Java 生成漂亮的JAXB类
我过去曾使用JAXB进行XML解析,并为此创建了自己的简单类。那些是波乔式的Java 生成漂亮的JAXB类,java,xml,jaxb,Java,Xml,Jaxb,我过去曾使用JAXB进行XML解析,并为此创建了自己的简单类。那些是波乔式的 public class Foo { @XmlAttribute public String someAttribute; public String someElement; public Bar bar; } 现在,我想编写一个工具,它必须解析来自非常复杂的xml结构的数据,我希望避免自己编写这些数据。我尝试使用xjc生成类,但它们看起来与我上面的示例完全不同: @XmlAc
public class Foo {
@XmlAttribute
public String someAttribute;
public String someElement;
public Bar bar;
}
现在,我想编写一个工具,它必须解析来自非常复杂的xml结构的数据,我希望避免自己编写这些数据。我尝试使用xjc生成类,但它们看起来与我上面的示例完全不同:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RulesElementType", propOrder = { "content" })
public class RulesElementType {
@XmlElementRefs({ @XmlElementRef(name = "flavor2", type = JAXBElement.class, required = false),
@XmlElementRef(name = "specific", type = JAXBElement.class, required = false),
@XmlElementRef(name = "category2", type = JAXBElement.class, required = false),
@XmlElementRef(name = "flavor1", type = JAXBElement.class, required = false),
@XmlElementRef(name = "print-prereqs", type = JAXBElement.class, required = false),
@XmlElementRef(name = "prereqs2", type = JAXBElement.class, required = false),
@XmlElementRef(name = "rules", type = JAXBElement.class, required = false),
@XmlElementRef(name = "prereqs1", type = JAXBElement.class, required = false) })
@XmlMixed
protected List<Serializable> content;
@XmlAttribute(name = "name")
protected String name;
@XmlAttribute(name = "type1")
protected String type1;
@XmlAttribute(name = "internal-id")
protected String internalId;
@XmlAttribute(name = "source")
protected String source;
@XmlAttribute(name = "revision-date")
protected String revisionDate;
/* getters and setters omitted */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "value" })
public static class Category2 {
@XmlValue
protected String value;
@XmlAttribute(name = "name")
protected String name;
/* getters and setters omitted */
}
/* additional class definitions omitted */
}
有没有办法使用xjc或其他工具来实现这一点
编辑:
我的xsd中RulesElementType的complexType为:
<xs:complexType name="RulesElementType" mixed="true">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="category2">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="prereqs2">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element type="xs:string" name="print-prereqs"/>
<xs:element name="flavor2">
<xs:complexType mixed="true">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element type="grantType" name="grant"/>
<xs:element type="stataddType" name="statadd"/>
<xs:element type="textstringType" name="textstring"/>
<xs:element type="selectType" name="select"/>
<xs:element type="replaceType" name="replace"/>
<xs:element type="modifyType" name="modify"/>
<xs:element type="dropType" name="drop"/>
<xs:element type="suggestType" name="suggest"/>
<xs:element type="stataliasType" name="statalias"/>
</xs:choice>
<xs:attribute type="xs:string" name="name" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element type="specificType" name="specific"/>
<xs:element type="rulesType" name="rules"/>
<xs:element type="xs:string" name="prereqs1"/>
<xs:element name="flavor1">
<xs:complexType mixed="true">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element type="grantType" name="grant"/>
<xs:element type="stataddType" name="statadd"/>
<xs:element type="textstringType" name="textstring"/>
<xs:element type="selectType" name="select"/>
<xs:element type="replaceType" name="replace"/>
<xs:element type="modifyType" name="modify"/>
<xs:element type="dropType" name="drop"/>
<xs:element type="suggestType" name="suggest"/>
<xs:element type="stataliasType" name="statalias"/>
</xs:choice>
<xs:attribute type="xs:string" name="name" use="optional"/>
</xs:complexType>
</xs:element>
</xs:choice>
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="type1" use="optional"/>
<xs:attribute type="xs:string" name="internal-id" use="optional"/>
<xs:attribute type="xs:string" name="source" use="optional"/>
<xs:attribute type="xs:string" name="revision-date" use="optional"/>
</xs:complexType>
XML文件看起来有点类似于
我使用XMLBeans生成xsd。由于我正在读取的XML文件大约有68000行,因此手动创建XSD不是一个选项。您可以使用简化内容属性
所以免责声明:我是作者
请参见以下问题:
简言之,如果您使用此插件并使用simplify:as element property
自定义进入content
属性的一个元素,您可以获得每个元素的独特且易于使用的元素属性。我希望这就是你说的“漂亮”的意思。很难确定你想要实现什么。要么使用xjc并使用生成的类,要么自己编写。你的问题在哪里?什么元素由列表表示?问题出在哪里?您能从对应于该类的XML模式中发布复杂类型吗?编辑我的问题以添加它应该部分添加的复杂类型。我更愿意完全避免jaxbelents,但这样至少我不必搜索。作为元素属性
避免jaxbelents
,它会生成@xmlement
-属性,他们不使用JAXBElements
。在花了相当长的时间使用maven设置生成之后,我被文档中的一些解释弄糊涂了,终于让它开始工作了。谢谢绝对欢迎您提供反馈。我的意思是,这是开源的,请帮助改进。我应该在哪里做呢?你合流中链接的jira页面给了我404,我没有找到任何其他联系信息。
<xs:complexType name="RulesElementType" mixed="true">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="category2">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="prereqs2">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element type="xs:string" name="print-prereqs"/>
<xs:element name="flavor2">
<xs:complexType mixed="true">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element type="grantType" name="grant"/>
<xs:element type="stataddType" name="statadd"/>
<xs:element type="textstringType" name="textstring"/>
<xs:element type="selectType" name="select"/>
<xs:element type="replaceType" name="replace"/>
<xs:element type="modifyType" name="modify"/>
<xs:element type="dropType" name="drop"/>
<xs:element type="suggestType" name="suggest"/>
<xs:element type="stataliasType" name="statalias"/>
</xs:choice>
<xs:attribute type="xs:string" name="name" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element type="specificType" name="specific"/>
<xs:element type="rulesType" name="rules"/>
<xs:element type="xs:string" name="prereqs1"/>
<xs:element name="flavor1">
<xs:complexType mixed="true">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element type="grantType" name="grant"/>
<xs:element type="stataddType" name="statadd"/>
<xs:element type="textstringType" name="textstring"/>
<xs:element type="selectType" name="select"/>
<xs:element type="replaceType" name="replace"/>
<xs:element type="modifyType" name="modify"/>
<xs:element type="dropType" name="drop"/>
<xs:element type="suggestType" name="suggest"/>
<xs:element type="stataliasType" name="statalias"/>
</xs:choice>
<xs:attribute type="xs:string" name="name" use="optional"/>
</xs:complexType>
</xs:element>
</xs:choice>
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="type1" use="optional"/>
<xs:attribute type="xs:string" name="internal-id" use="optional"/>
<xs:attribute type="xs:string" name="source" use="optional"/>
<xs:attribute type="xs:string" name="revision-date" use="optional"/>
</xs:complexType>