我继承了一个项目,该项目大量使用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>"
答案 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
:
完整示例