java - 如何修改 JAXB 编码输出流以包含任意内联 XML?

标签 java xml jaxb marshalling

我想修改 JAXB 编码操作的输出流以包含一些任意 XML。这是一个说明情况的示例。

我有一个任意的 Product带有 JAXB 注释的域对象,当前看起来像这样:

@XmlRootElement(name="Product")
public class Product {

  @XmlElement(name="CommonProperty")
  private String commonProperty="Something";  

  @XmlElement(name="ExtraXml")
  private String extraXml="Something extra";

}

这通常会编码为:

<Product>
  <CommonProperty>Something</CommonProperty>
  <ExtraXml>Something else</ExtraXml>
</Product>

现在,如果 extraXml 会怎样?字段包含一些额外的 XML(具有任意复杂性),这些 XML 将与最终编码结果内联?

比如说,extraXml包含“<abc><def>Something extra</def></abc> ”,我真的很想要一个使我能够编码 Product 的解决方案像这样(格式可选):

<Product>
  <CommonProperty>Something</CommonProperty>
  <abc>
    <def>Something extra</def>
  </abc>
</Product>

我看过this related question但它并没有完全产生我想要的结果,因为它似乎更适合整体格式更改而不是 DOM 插入。

extraXml属性只是为了说明,它可以标记为 @XmlTransient或进入一个专门的类(class)。唯一的标准是它可以以某种方式获得 String包含完全任意的 XML 内容以附加到个人 Product编码输出。

我还应该提到,此输出的消费者能够以适合他们的方式解析任意内容。这里的目的是简化服务器端的处理。

在此先感谢您提供的任何帮助。

最佳答案

您可以将额外的 XML 表示为 DOM 节点而不是字符串。

将 extraXML 属性更改为 org.w3c.dom.Node 而不是 String,并使用 @XmlAnyElement 对其进行注释。

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.w3c.dom.Node;

@XmlRootElement(name="Product")
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {

  @XmlElement(name="CommonProperty")
  private String commonProperty="Something";  

  @XmlAnyElement
  private Node extraXml;

}

然后当您编码 XML 文档时,例如:

<Product>
  <CommonProperty>Something</CommonProperty>
  <abc>
    <def>Something extra</def>
  </abc>
</Product>

使用以下代码:

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Product.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("input.xml");
        Product product = (Product) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(product, System.out);
    }
}

“额外的 XML”将保留为 DOM 节点。

关于java - 如何修改 JAXB 编码输出流以包含任意内联 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4224544/

相关文章:

java - 如何通过验证在 JAXB 中进行部分解析 xml?

java - JsonIgnore 和 XmlElement 注释冲突

c# - XmlSerializer - 将 xml 文件迁移到新版本的最佳方式

java - 客户端和服务器如何暂停以等待对方发送下一条消息?

java - Java Swing 中奇怪的并发问题

java - 如何使用枚举中的字符串值作为输入来输出 Java 中该枚举项的其余数据?

android - 如何在渐变中给出 20 度角?

java - fragment 在应用程序中不起作用

java - 名称为 "unknown"的 JAXB 映射元素

java - 如何使不同电脑的速度(游戏帧率)相同?