将类导出到XML的独立方法

时间:2018-03-10 21:56:20

标签: java xml

我有一个班级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()课程中的NodeNode是一个孩子,一个是根。我使用pugixml在C ++中做了完全相同的事情,因为文档本身就是一个节点,所以我只需要将它提供给exportXML()方法,如果我想要一个root用户的话。

是否可以在Java XML实现中使用通用的exportXML()方法?

1 个答案:

答案 0 :(得分:2)

坚持使用DOM方法,看起来最简单的方法是让Container创建自己的元素。然后,NodeContainer都可以将自己添加到传入的父DocumentElement中。

(遗憾的是,我们不得不在这里处理两个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注释的功能。