Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merging different nodes of multiple XML files using JAVA

Tags:

java

merge

xml

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!!!

like image 747
Vasouli Avatar asked Mar 22 '23 02:03

Vasouli


2 Answers

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 
like image 74
Sage Avatar answered Apr 01 '23 16:04

Sage


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.

like image 36
Isuru Gunawardana Avatar answered Apr 01 '23 16:04

Isuru Gunawardana