2014-01-13 3 views
0

Я хочу создать новый XML-документ. Я использую метод для создания корневого элемента моего нового документа xml, и этот метод возвращает мне корневой элемент.Добавление нового элемента XML в существующий элемент xml

Чем я создаю другой метод для добавления дочернего элемента в корневой элемент, возвращаемый первым методом.

Проблема заключается в том, что, когда я использую эти два метода отдельно, я не получаю никакого результата, но когда я использую только один метод для выполнения всей работы этого двух методов, я получаю ожидаемый результат. Это код, когда он хорошо работает:

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-документ:

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; 
    } 

Любая идея, как решить эту проблему, пожалуйста?

+0

Пожалуйста, покажите код, который вызывает эти методы в каждом случае. –

+1

Чтобы лучше помочь, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). –

+0

отредактировал код –

ответ

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); 
    } 
0

Ваши 2 программы не идентичны! Во втором примере, вы использовали

Node rootElement 

В первом примере вы использовали:

Element rootElement 

Я надеюсь, что это помогает!

+0

Интерфейс Element является вспомогательным интерфейсом интерфейса Node. В соответствии с принципом замещения Лискова (http://en.wikipedia.org/wiki/Liskov_substitution_principle) можно сказать, что они эквивалентны. –

0

В любом случае Я бы не продолжал, как вы, с помощью двух разных методов. Вместо этого попробуйте это.

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.

Смежные вопросы