我有一个班级Container
:
public class Container implements Exportable {
private Node root;
private String name;
public void exportXML(Element target, Document document) {
target.setAttribute("name", name);
root.exportXML(target, document);
}
}
实现了接口Exportable
,它定义了两个抽象方法,一个用于导入,一个用于导出。目标是将我的类导出为XML格式
如您所见,Container类采用Node
,它是Node
树的根。这是Node
类:
public class Node implements Exportable {
private ArrayList<Node> children = new ArrayList<>();
private String name;
public void exportXML(Element target, Document document) {
Element node = document.createElement("node");
target.appendChild(node);
node.setAttribute("name", name);
if (children.size() > 0) {
Element nodes = document.createElement("nodes");
node.appendChild(nodes);
for (Node child : children) {
child.exportXML(nodes, document);
}
}
}
}
我使用SaveManager
类导出Container
对象:
public class SaveManager {
public static void exportContainer(Container container, String pathname) {
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element projectNode = document.createElement("container");
document.appendChild(projectNode);
container.exportXML(projectNode, document);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(pathname));
transformer.transform(source, result);
} catch (ParserConfigurationException | TransformerException e) {
e.printStackTrace();
}
}
}
我需要能够单独导出Node
,而不需要Container
。例如,如果我致电nodeA.exportXML()
,则nodeA
将成为树的根。
问题是我的SaveManager
中有两个方法完全相同(即在一个对象上调用exportXML()并将结果保存到XML文件中)我将不得不创建方法我exportXML()
课程中的Node
,Node
是一个孩子,一个是根。我使用pugixml
在C ++中做了完全相同的事情,因为文档本身就是一个节点,所以我只需要将它提供给exportXML()方法,如果我想要一个root用户的话。
是否可以在Java XML实现中使用通用的exportXML()方法?
答案 0 :(得分:2)
坚持使用DOM方法,看起来最简单的方法是让Container
创建自己的元素。然后,Node
和Container
都可以将自己添加到传入的父Document
或Element
中。
(遗憾的是,我们不得不在这里处理两个Node
类,但是......)这样做的诀窍是使用org.w3c.dom.Node
作为{{1}中的第一个参数这是exportXML()
和Document
的超接口,因此可以处理传入的根或子进程:
Element
public class Container implements Exportable {
private Node root;
private String name;
@Override
public void exportXML(org.w3c.dom.Node target, Document document) {
Element node = document.createElement("container");
document.appendChild(node);
node.setAttribute("name", name);
root.exportXML(target, document);
}
}
然后可以在开始时传递SaveManager
:
Document
您的 Document document = documentBuilder.newDocument();
//Element projectNode = document.createElement("container");
//document.appendChild(projectNode);
container.exportXML(document, document);
课程应该保持不变,只需要传入Node
。
但同意之前关于XStream或JAX-B的评论。例如,到目前为止生成的大多数XML都具有少量org.w3c.dom.Node target
和@XmlElement
注释的功能。