Tag: xml serialization

JAXB注释

我需要一些JAXB Annotations的帮助,我找不到好的doc帮助我解决这个问题。 我有一个我想编组成XML的类。 我的class级看起来像这样: @XmlRootElement(name=”car”) @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder = { “vid”, “make”, “model”, “recalls”, “engSpec” }) public class Car { @XmlElement(name=”vid”, required=true) private String vid; @XmlElement(name=”make”, required=true) private String make; @XmlElement(name=”model”, required=true) private String model; @XmlElement(name=”recalls”, required=true) private ArrayList recalls; @XmlElement(name=”engSpec”, required=true) private EngSpec engSpec; … 召回课看起来像这样: @XmlRootElement(name = “recall”) @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder = { “type”, “date” […]

使用JAXB来支持具有微小变化的模式

情况 我需要支持基于模式生成XML文档,这些模式之间只是略有不同。 具体来说,我需要支持的模式基于行业标准,这些标准随着时间的推移会略有变化,供应商可能会制作自己的定制版本。 问题 我打算使用inheritance的JAXB 2(来自Metro)作为解决方案。 我期望包结构最终会像这样: com.company.xml.schema.v1 com.company.xml.schema.v2 com.company.xml.schema.v2.vendorxyz v2包中的类只是扩展v1包中的类并根据需要覆盖。 不幸的是,该计划最终变得不可能,因为子类不能覆盖父类中的注释( 参见此处 )。 例如,如果模式中的属性在版本之间重命名,则v2元素类必须完全重新实现该元素而不从v1inheritance。 据我所知,这让我只有两个选择 选项1 为每个模式类型创建“基础”包,使用@XmlAccessorType(XmlAccessType.NONE)注释该包中的元素类,并删除所有其他注释。 然后,在每个版本化的包中创建类,这些类将“base”包中的相应类子类化,并添加所有必需的注释。 这个解决方案确实给了我一些inheritance领域的帮助,但代码重复是巨大的,维护是一个挑战。 选项2 不要使用JAXB。 我真的不喜欢这个解决方案,因为我也想使用JAX-RS / JAX-WS。 问题 我应该如何使用JAXB来支持具有微小变化的多个模式,而不需要一堆代码重复? 我应该看一下不同的技术组合吗? 编辑 Blaise下面的解决方案非常适用于我们的大部分模式,这些模式只是彼此之间的一个小翻译,通常具有相同的数据。 但是,如果将inheritance与包名称用于版本控制更有意义,我们遇到了一个问题。 例如: com.company.xml.schema.v1.ElementA com.company.xml.schema.v2.ElementA (其中v2.ElementA扩展v1.ElementA) 在这种情况下使用MOXy的OXM会遇到错误,可以在这里找到解决方法(使用Blaise提供的解决方案,不能少!)

使用java从生成的xml文档中删除xml声明

String root = “RdbTunnels”; DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document document = documentBuilder.newDocument(); Element rootElement = document.createElement(root); document.appendChild(rootElement); OutputFormat format = new OutputFormat(document); format.setIndenting(true); XMLSerializer serializer = new XMLSerializer(System.out, format); serializer.serialize(document); 结果如下 但我需要从输出中删除xml声明我该怎么做

我可以强制JAXB不转换成“进入”,例如,当编组到XML时?

我有一个使用JAXB编组为XML的Object。 一个元素包含一个包含引号(“)的String。生成的XML具有" where“存在的位置。 即使这通常是首选,我需要我的输出来匹配遗留系统。 如何强制JAXB不转换HTML实体? – 感谢您的答复。 但是,我从未看到调用处理程序escape()。 你能看一看,看看我做错了什么吗? 谢谢! package org.dc.model; import java.io.IOException; import java.io.Writer; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import org.dc.generated.Shiporder; import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler; public class PleaseWork { public void prettyPlease() throws JAXBException { Shiporder shipOrder = new Shiporder(); shipOrder.setOrderid(“Order’s ID”); shipOrder.setOrderperson(“The woman said, \”How ya doin & stuff?\””); JAXBContext context = JAXBContext.newInstance(“org.dc.generated”); […]

JAXB映射对XML的循环引用

我有一个包含循环的对象图。 如何让JAXB处理这个问题? 我尝试在子类中使用@XmlTransient注释,但JAXB marshaller仍然检测到循环。 @Entity @XmlRootElement public class Contact { @Id private Long contactId; @OneToMany(mappedBy = “contact”) private List addresses; … } @Entity @XmlRootElement public class ContactAddress { @Id private Long contactAddressId; @ManyToOne @JoinColumn(name = “contact_id”) private Contact contact; private String address; … }