【发布时间】:2021-07-19 12:03:11
【问题描述】:
我正在尝试使用 JAXB 库中的 marshaling 方法创建 XML。对于这种方法,我使用标准的 java 类并将注解分配给它。我想为类中不是Collections的一些元素添加一个包装器元素。
我知道@XmlElementWrapper 可以用于Collections,但我没有收藏。我有一些元素,我希望有一个外部 XML 元素,以便它可以匹配标准 XSD。
我只是想知道是否有一种方法可以将外部 XML 元素添加到某些元素,以便创建的 XML 匹配标准 XSD 格式。如果没有直接的方法,我可以采取什么替代方法?
从示例 XML 中可以看出,carinfo 标签是元素 engine 和 year 的外部(包装)标签,但 carInfo 标签不存在于 Parent 或 @987654332 中@ 班级。由于这些是标准类,我无法修改字段/添加新字段。因此,我想使用 JAXB 处理包装 XML 标记添加。
以下是输入的 JSON:
{
"brand": "Ferari",
"build": "Italy",
"engine": "Mercedes",
"year": "2021"
}
以下是我想要的输出 XML:
<?xml version="1.0"?>
<Car>
<brand>Ferari</brand>
<build>Italy</build>
<carinfo>
<engine>Mercedes</engine>
<year>2021</year>
</carinfo>
</Car>
以下是我的课程:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlTransient
@XmlType(name = "Parent")
public class Parent{
private String brand;
private String year;
//Getters and Setters avoided
}
基于创建 XML 的类:
@XmlRootElement(name = "Car")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Child",propOrder={"brand","engine","build","year"})
public class Child extends Parent{
private String engine;
private String build;
//Getter and Setters avoided
}
将创建 XML 的主类:我正在使用 Jackson 库从 Json 文件中读取值并基于 Jaxb 注释创建 XML。
public class Main{
public static void main(String []args){
JsonFactory jsonFactory = new JsonFactory();
JsonParser jsonParser = jsonFactory.createParser(new File(Main.class.getClassLoader().getResource("input.json").toURI()));
Child eventInfo = jsonParser.readValueAs(Child.class);
JAXBContext context = JAXBContext.newInstance(Child.class);
Marshaller mar = context.createMarshaller();
mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
mar.marshal(eventInfo, System.out);
}
}
【问题讨论】:
-
您好,可以添加 input.json 吗?
-
@dariosicily 很抱歉错过了添加
Json。我现在加了。请检查。从 JSON 中可以看出,我没有carInfo标签,但在XML中我想添加carInfo标签。有没有办法可以将class中不存在的附加标签添加到我的XML -
除非你修改你的类,否则我的建议是通过 jaxb 来做这件事,即使丑陋的是操纵 xml 树以获得所需的结果。
-
非常感谢您的时间和回复。实际上,这是可能的,我能够找到解决方法。我在这里发布了一个问题:stackoverflow.com/questions/67300882/… 现在我正试图找出一种方法将其设为
XML Adapter,而不是将其作为类中的方法。 -
感谢您的链接,同时我找到了一个可能的解决方案,使用 xsl 文件而不修改原始类,所以如果您有兴趣,我会提交答案。
标签: java xml jaxb marshalling