JAXB - 不要解组嵌套元素 - 可能吗?

时间:2010-06-03 08:14:20

标签: java jaxb

我继承了一个项目,该项目大量使用JAXB将XML消息映射到Java对象。我遇到的问题是我收到的一些数据(在这种情况下是未知形式的嵌套XML)不能被解组,而是作为字符串捕获。

一个例子可以帮助

<a>
   <b></b>
   <c></c>
   <d>
       <!-- "Unknown" XML here -->
       <maybeE></maybeE>
       <maybeF></maybeF>
       <!-- etc etc -->
   <d/>
</a>

所以我希望JAXB解组“b”和“c”,但“d”它会将嵌套的XML捕获为字符串,即未解析。

所以打电话:

getD()

会返回字符串:

"<maybeE></maybeE><maybeF></maybeF>"

4 个答案:

答案 0 :(得分:4)

您无法将嵌套内容捕获为String,但可以将其捕获为DOM,例如

@XmlRootElement(name="a")
public class A {

   @XmlElement
   private String b;

   @XmlElement
   private String c;

   @XmlAnyElement
   private List<Element> content;
}

<a>包含哪些内容与<b><c>不匹配,将存储在content下。然后,如果您愿意,可以将这些Element对象转换为字符串。

答案 1 :(得分:1)

我发现上面的内容非常有用;我有一个类似的映射问题,我有HTML没有转义或编码存储在xml文件中 - 我想将它映射到String属性。

我使用了注释:

@XmlElementWrapper(name="operations")
@XmlAnyElement
private List<Node> operations;

然后使用变换器打印节点树:

public String getOperationsAsString() throws Exception{
    StringBuilder builder = new StringBuilder();
    for (Node node: operations) {
        StringWriter writer = new StringWriter();
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.transform(new DOMSource(node), new StreamResult(writer));
        builder.append(writer.toString());
    }
    return builder.toString();
}

答案 2 :(得分:1)

@Andrew B:您的代码甚至可以改进:

public String getOperationsAsString() throws Exception{
    StringWriter writer = new StringWriter();
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    for (Node node: operations) {
        transformer.transform(new DOMSource(node), new StreamResult(writer));
    }
    return writer.toString();
}

这样,您只需创建一次Transformer,而不需要StringBuilder。 StringWriter已经在内部写入了StringBuffer。

答案 3 :(得分:0)

您可以使用@XmlAnyElement注释保留未知的XML。默认情况下,这会将其保留为DOM。如果您希望以其他格式(例如String)存储,则可以指定DomHandler

完整示例