gpt4 book ai didi

java - 生成漂亮的 JAXB 类

转载 作者:数据小太阳 更新时间:2023-10-29 02:29:59 26 4
gpt4 key购买 nike

我过去曾使用 JAXB 进行 XML 解析,并为其创建了自己的简单类。那些是 POJO,比如

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 */

}

要获得名为“flavor1”的元素,我必须在“content”属性中搜索名为“flavor1”的 JAXBElement,我发现这非常不方便。我希望能够做的是:

String flavor1 = rulesElement.getFlavor1();

有没有办法使用 xjc 或其他工具来完成此操作?

编辑:来 self 的 xsd 的 RulesElementType 的复杂类型是:

  <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 文件看起来有点类似于 this .

我使用 XMLBeans 生成 xsd。由于我正在读取的 XML 文件有大约 680k 行,手动创建 XSD 不是一个选项。

最佳答案

您可以使用 Simplify plugin简化您的 content 属性。

SO 免责声明:我是作者。

请看这个问题:

Generate java classes from xsd with jaxb from a choice

extracting element text value

简而言之,如果您使用此插件并使用 simplify:as-element-property 自定义进入您的 content 属性的元素之一,您可以得到不同的每个元素易于使用元素属性。我希望这就是您所说的“漂亮”。

关于java - 生成漂亮的 JAXB 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26158956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com