如何使用xmlbeans从另一个xml添加节点

时间:2014-06-14 11:27:47

标签: java xml xmlbeans

我正在使用xmlbeans来生成xml文档,而我需要从另一个xml文件中提取所有子项并将它们插入到我当前的文档中。 to_be_add.xml

<root>
    <style>
        .....
    </style>
    <atlas img="styles/jmap.png">
        ....
    </atlas>
    .....
</root>

这个xml文件没有架构,所以我没有创建相关的java类来映射它。你认为它是一个普通的xml文件。

我希望添加style atlas个节点。我使用以下代码:

        XmlObject pointRoot = XmlObject.Factory.parse(Main.class.getResourceAsStream("to_be_added.xml"));
        NodeList nodeList = pointRoot.getDomNode().getChildNodes();

        Node themeNode = renderthemeDoc.getDomNode();
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            themeNode.appendChild(node);
        }

然后我收到了错误:

  

线程“main”中的异常   org.apache.xmlbeans.impl.store.DomImpl $ WrongDocumentErr:要添加的子项   来自另一个文件

我发现这篇帖子通过搜索“child to .... another document”:how to add a xml document to another xml document in java表示元素和文档之间的连接必须在元素之间断开才可以添加到其他文档

所以我尝试构建Document对象(这就是变量pointDocthemeDoc存在的原因):

        XmlObject pointRoot = XmlObject.Factory.parse(Main.class.getResourceAsStream("to_be_added.xml"));
        Document pointDoc = pointRoot.getDomNode().getOwnerDocument();
        System.out.println(pointDoc);
        Element element = pointDoc.getDocumentElement();
        NodeList nodeList = element.getChildNodes();

        Document themeDoc = myCurrentDoc.getDomNode().getOwnerDocument();
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            node = themeDoc.importNode(node, true);
            themeDoc.appendChild(node);
        }

然后我得到NullPointerException,表示pointDoc为空。

这是我尝试解决这个问题的整个过程。如果不清楚,请告诉我,我会相应更新。

是否可以修复它?

1 个答案:

答案 0 :(得分:-1)

由于其他 XML文件未映射到类,因此您可以使用常规DOM解析器来读取它并提取其节点。但是使用通用对象工厂,您仍然可以获得节点:

    XmlObject pointRoot = XmlObject.Factory.parse(  "<root>\n" +
                                                    "    <style>\n" +
                                                    "    </style>\n" +
                                                    "    <atlas img=\"styles/jmap.png\">\n" +
                                                    "    </atlas>\n" +
                                                    "</root>");

    Node pointDoc = pointRoot.getDomNode().getFirstChild();
    NodeList nodeList = pointDoc.getChildNodes();

    for(int i = 0; i < nodeList.getLength(); i++) {
        System.out.println("Node: " + nodeList.item(i).getNodeName());
    }

这将打印:

Node: #text
Node: style
Node: #text
Node: atlas
Node: #text