在现有xml元素上添加新的XML元素

时间:2014-01-13 16:52:51

标签: java xml

我想创建一个新的XML文档。我使用一种方法来创建我的新xml doc的根元素,这个方法返回我的根元素。

比我创建另一个方法将子项添加到第一个方法返回的根元素。

问题是,当我单独使用这两个方法时,我没有得到任何结果,但是当我只使用一种方法来完成这两种方法的所有工作时,我得到了预期的结果。 这是正常工作时的代码:

public static Node setRootElement (Document bpmn_doc){
        Element rootElement = bpmn_doc.createElement("bpmn2:definitions");

        Element processNode = bpmn_doc.createElement("bpmn2:process");

        processNode.setAttribute("id", "Definitions_1"); 
        rootElement.appendChild(processNode);
        System.out.println(rootElement.getNodeName());
        System.out.println(processNode.getAttribute("id"));

        return rootElement;

    } 

结果是:

bpmn2:definitions
Definitions_1

当我使用两种不同的方法以这种方式完成这项工作时:

public static Node setRootElement (Document bpmn_doc){
        Element rootElement = bpmn_doc.createElement("bpmn2:definitions");
        return rootElement;
    }

public static Node appendProcessNode(Document bpmn_doc) {
        Node rootElement = setRootElement(bpmn_doc);
        Element processNode = bpmn_doc.createElement("bpmn2:process");
                processNode.setAttribute("id", "Definitions_1");
        rootElement.appendChild(processNode);
        System.out.println(rootElement.getNodeName());
        System.out.println(processNode.getAttribute("id"));
        return processNode ;
    }

我没有得到任何结果。

这是调用方法的地方:

public static void main(String[] args) throws Exception {
appendProcessNode(buildTheDocument());
    }

其中buildTheDocument()是创建新xml doc的方法:

public static Document buildTheDocument () throws ParserConfigurationException, SAXException, IOException{
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document bpmn_doc = builder.newDocument(); //Krijoj nje document te ri ku do ruaj versionin BPMN
        return bpmn_doc;
    }

请知道如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

你的2个程序不一样! 在第二个示例中,您已使用

Node rootElement

在您使用的第一个示例中:

Element rootElement

我希望它有所帮助!

答案 1 :(得分:0)

反正 我不会像你用2种不同的方法那样进行。而是试试这个。

public static Node setRootElement (Document bpmn_doc){
        Element rootElement = bpmn_doc.createElement("bpmn2:definitions");
        return rootElement;
    }

public static Node appendProcessNode(Document bpmn_doc) {
        Node rootElement = setRootElement(bpmn_doc);
        NodeList processNodes = bpmn_doc.getElementByTagName("bpmn2:process");
        Node processNode = processNode.item(0);// add more control to make sure the nodelist is not empty
        processNode.setAttribute("id", "Definitions_1");
        rootElement.appendChild(processNode);
        System.out.println(rootElement.getNodeName());
        System.out.println(processNode.getAttribute("id"));
    }

我怀疑你从第一个方法得到的节点没有任何对文件对象bpmn2_doc的实际节点的引用! 我没有测试过代码,但是检查javadoc以找出对象Element / Node可用的更多方法。

答案 2 :(得分:0)

我解决了我的问题! 我保留了我创建的两种方法,但在第二种方法上略有不同。我没有将我创建的processNode附加到此方法中的根元素

public static Node appendProcessNode(Document bpmn_doc) {
        NodeList processNodes = bpmn_doc.getElementByTagName("bpmn2:process");
        Node processNode = processNode.item(0);
        processNode.setAttribute("id", "Definitions_1");
    }

相反,我创建了另一种方法,并在这里完成工作:

 public static createXml (Document bpmn_doc){
    Node rootElement = setRootElement(bpmn_doc);
    Node processNode = createProcessNode(bpmn_doc);
    rootElement.appendChild(processNode);
    }