4

I have some xml files in an arrayList, for example A.xml B.xml and I want to merge some of the nodes while the rest to remain as are using java. I'm new at using so I don't know how to do.

A xml:

<?xml version="1.0" encoding="UTF-8"?>
<nta>
<declaration>
    bool A, B;
    bool C;
</declaration>
<template>
    <location id="1"  x="10" y="10"/>
    <transition>
        <source ref="3"/>
    </transition>    
</template>
<system> system AND;</system>
</nta>

B.xml:

<?xml version="1.0" encoding="UTF-8"?>
<nta>
<declaration>
    int f,k;
    bool D;
</declaration>
<template>
    <location id="100"  x="40" y="89"/>
    <transition>
        <source col="9"/>
    </transition>    
</template>
<system> system OR;</system>
</nta>

And the output:

<?xml version="1.0" encoding="UTF-8"?>
<nta>
<declaration>
    bool A, B;
    bool C;
    int f,k;
    bool D;
</declaration>
<template>
    <location id="1"  x="10" y="10"/>
    <transition>
        <source ref="3"/>
    </transition>    
</template>
<template>
    <location id="100"  x="40" y="89"/>
    <transition>
        <source col="9"/>
    </transition>    
</template>
<system> system AND, OR;</system>
</nta>

Basically I want to merge the declaration and the system and the rest to be serial in the output xml file. How to do this using JAVA? Sorry for the long post!!!

2
  • Take a look at this Commented Oct 11, 2013 at 11:10
  • using JDOMit should be piece of cake. Commented Oct 12, 2013 at 0:48

3 Answers 3

6

In comparison with other available XML processing API, to me, having DOMBuilder and SAXBuilder JDOM is better for:

  • Modifying the XML document
  • XML tree traversing and random access to any section
  • Merging documents

This is a complete working example for merging two XML document:

    SAXBuilder builder = new SAXBuilder();
    Document doc1 = builder.build(new File("E:\\XML1.xml"));
    Document doc2 = builder.build(new File("E:\\XML2.xml"));

    String rootName = doc1.getRootElement().getName();
    Element newRoot = new Element(rootName);
    Document newDoc = new Document(newRoot);

    Element root1 = doc1.getRootElement();
    Element root2 = doc2.getRootElement();

         // creating declaraion element by merging the declaration content
    Element declaration = new Element("declaration");
    declaration.addContent(root1.getChildText("declaration"));
    declaration.addContent(root2.getChildText("declaration"));
    newRoot.addContent(declaration); // add declaration element to new document

         newRoot.addContent(root1.getChild("template").clone()); 
                       // directly adding template from document XML1, 
                      //after getting template child,
                     //it needs to be cloned to detached  from its parent  

     newRoot.addContent(root2.getChild("template").clone()); 
                       // same for document XML2

     /*** now code yourself  for system element here ***/

    XMLOutputter outputter = new XMLOutputter();
    outputter.output(newDoc, System.out); 
                  // output the new doc, pass your OutputStream to this function 
Sign up to request clarification or add additional context in comments.

4 Comments

Thakn you very much. This works fine. But I have another question. What if there are three different template in the first XML and five in the second and I want to keep their structure. How I do this? Using a for loop?
yes. using a for loop. give it a try. However, the common style to use the site is to mark an answer accepted if you think it solved your question.
Oh I'm sorry I didn't know that. I thougt green arrow goes with vote up and I can't vote until my reputation is 15
it's ok. you don't have to be sorry. I just wanted to let you know. Many user avoids new user's question because sometimes they forget to upvote. And thanks
1

You can use an xml parser such as dom to read the required parts (declaration and system) and later aggregate them to get your required out put.

you will get plenty of examples on reading and writing xml in java.

Comments

0

Parse XML as i write here or in any another way nad then use javax.xml.parsers.DocumentBuilder from here to do what you want.Create a new XML doc.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.