Pavan M
Pavan M

Reputation: 19

Creating XML file with multiple sub elements

I have the values of XML elements in ArrayList objects. I have to create XML file with the following structure of having the elements with child nodes.

The number, name and level are added to the arraylist objects alNumber, alName and alLevel respectively. Values were added to the arraylist objects in the following order.

alNumber.get(1)=0000000042
alName.get(1)=Test Part2
alLevel.get(1)=1
alNumber.get(2)=0000000022
alName.get(2)=Test3243
alLevel.get(2)=1
alNumber.get(3)=0000000061
alName.get(3)=testpartsub
alLevel.get(3)=1
alNumber.get(4)=0000000083
alName.get(4)=testpartsub4
alLevel.get(4)=2

.......

Following should be the output of XML file:

<?xml version="1.0" encoding="UTF-8"?>
<node name="Test Par1" number="0000000041">
   <node name="Test Part2" number="0000000042"/> //Level - 1
   <node name="Test3243" number="0000000022"/>
   <node name="testpartsub" number="0000000061">
        <node name="testpartsub4" number="0000000083"/>  //<Level -2 
        <node name="testpartsub1" number="0000000081">
            <node name="Test1" number="0000000001"/>    //Level -3
            <node name="Testpartsub3" number="0000000082">
                <node name="Test2" number="0000000021"/>   //Level - 4
            </node>
        </node>
    </node>
   <node name="testpartsub2" number="0000000062"/>
   <node name="Test Part4" number="0000000044">
        <node name="testpart4sub1" number="0000000084"/>
   </node>
   <node name="Test Part3" number="0000000043">
        <node name="Test Part5" number="0000000045"/>
        <node name="Test Part6" number="0000000046">
            <node name="Test334344" number="0000000047"/>
            <node name="Test Part4" number="0000000044">
                <node name="testpart4sub1" number="0000000084"/>
            </node>
        </node>
   </node>
   <node name="Testpartsub3" number="0000000082">
      <node name="Test2" number="0000000021"/>
   </node>
</node>

Here is my code:

DocumentBuilderFactory xmlDocFactory = DocumentBuilderFactory.newInstance();
          DocumentBuilder xmlDocBuilder = xmlDocFactory.newDocumentBuilder();
          System.out.println("**Creating XML File ...");

          xmlDocument = xmlDocBuilder.newDocument();
          rootElement = xmlDocument.createElement("node");
          rootElement.setAttribute("number", wtpart.getNumber());
          rootElement.setAttribute("name", wtpart.getName());
          xmlDocument.appendChild(rootElement);

          Iterator<Integer> iter = alLevel.iterator();

          for (int i=1, j=i+1; i<alNumber.size() && i<alName.size() && i<alLevel.size(); i++,j++) {

              if (alLevel.get(i) == 1) {
                  Element element = xmlDocument.createElement("node");
                  element.setAttribute("number", alNumber.get(i));
                  element.setAttribute("name", alName.get(i));
                  rootElement.appendChild(element);
                  prevElement = element;
              }
              else if (j<=i) {
              if (alLevel.get(j)>alLevel.get(i)){
                  if (alLevel.get(j) != 1) {
                      Element element = xmlDocument.createElement("node");
                      element.setAttribute("number", alNumber.get(i));
                      element.setAttribute("name", alName.get(i));
                      prevElement.appendChild(element);
                      prevElement = element;
                  }}
              else {
                  Element element = xmlDocument.createElement("node");
                  element.setAttribute("number", alNumber.get(i));
                  element.setAttribute("name", alName.get(i));
                  prevElement.appendChild(element);
              }
              }
              else {
                  Element element = xmlDocument.createElement("node");
                  element.setAttribute("number", alNumber.get(i));
                  element.setAttribute("name", alName.get(i));
                  prevElement.appendChild(element);
              }
          }

          TransformerFactory transformerFactory = TransformerFactory.newInstance();
          Transformer transformer = transformerFactory.newTransformer();
          transformer.setOutputProperty(OutputKeys.INDENT, "yes");
          transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
          DOMSource source = new DOMSource(xmlDocument);
          StreamResult result = new StreamResult(new File("E:\\temp", "Test.xml") );
          transformer.transform(source, result);

Upvotes: 0

Views: 1653

Answers (2)

Pavan M
Pavan M

Reputation: 19

Thanks Obenland. It worked this way for n levels.

for (int i = 0; i < alNumber.size(); i++) {
    int currentLevel = alLevel.get(i);
    Element node = xmlDocument.createElement("node");
    node.setAttribute("number", alNumber.get(i));
    node.setAttribute("name", alName.get(i));

    int levelDifference = previousLevel - currentLevel + 1;

    while(levelDifference > 0 ) {
        elementStack.remove(elementStack.size() - 1);
        levelDifference--;
    }

    if(i == 0) {
        xmlDocument.appendChild(node);
    } else {
        Element parentElement = elementStack.get(currentLevel - 1);
        parentElement.appendChild(node);
        elementStack.set(currentLevel - 1,  parentElement);
    }
    elementStack.add(node);
    previousLevel = currentLevel;
    }

Upvotes: 1

Obenland
Obenland

Reputation: 866

I think your code doesn't work because you are describing the special cases of level 1 and 2 of your problem. Now you have to add code to handle level 3 and 4 and so on. But what's about level 1337? Do you want to write extra code for every level up to level 1337? I don't think so. Try to extract the most common scenario:

I am an XML-Element on level n. There is a new element to add to level m.

To add a new element I have to walk to the element above the level the new element should be added. So level m - 1. The new element will be added and after that I am the new element on level m.

You can use getParentNode() to go one level up.

So you need two nested for-loops. The first iterates over your lists, the second should be used to go n - (m - 1) levels up.

You start with the root-element and n = 0.

Upvotes: 0

Related Questions