2017-04-21 1 views
0

Ich habe die Werte von XML-Elementen in ArrayList-Objekten. Ich muss XML-Datei mit der folgenden Struktur der Elemente mit Kindknoten erstellen.XML-Datei mit mehreren Unterelementen erstellen

Die Anzahl, der Name und die Ebene werden den arraylist-Objekten alNumber, alName bzw. alLevel hinzugefügt. In der folgenden Reihenfolge wurden den Arraylist-Objekten Werte hinzugefügt.

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 

.......

sollte die Ausgabe von XML-Datei Folgende:

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

Hier ist mein 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); 
+2

Ok. Aber was ist dein Problem? Was hast du versucht? Sind das deine Hausaufgaben? Eine Frage ohne Fragezeichen ist keine Frage. – Obenland

+0

Ich versuche, diese XML-Datei zu erstellen. Aber es konnte nicht in dem erforderlichen Format drucken. –

+0

Für Level 1 und 2 scheint mir alles in Ordnung zu sein. Aber dann scheitert es. Ich denke, du musst deinen Code umschreiben. Ich schreibe dir meine Ideen als Antwort, also dauert es eine Sekunde. – Obenland

Antwort

1

Dank Obenland. Es hat auf diese Weise für n Ebenen funktioniert.

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

denke ich Ihren Code funktioniert nicht, weil Sie die Spezialfälle von Level 1 und 2 Ihres Problems beschreiben. Jetzt müssen Sie Code hinzufügen, um Level 3 und 4 usw. zu behandeln. Aber was ist mit Level 1337? Möchtest du extra Code für jedes Level bis Level 1337 schreiben? Ich denke nicht. Versuchen Sie, das häufigste Szenario zu extrahieren:

Ich bin ein XML-Element auf der Ebene n. Es gibt ein neues Element, das zu Level m hinzugefügt werden kann.

Um ein neues Element hinzuzufügen, muss ich zu dem Element oberhalb der Ebene gehen, zu der das neue Element hinzugefügt werden soll. Also Level m - 1. Das neue Element wird hinzugefügt und danach bin ich das neue Element auf Level m.

Sie können getParentNode() verwenden, um eine Ebene höher zu gehen.

Sie brauchen also zwei verschachtelte for-Schleifen. Der erste iteriert über Ihre Listen, der zweite sollte verwendet werden, um n - (m - 1) -Ebenen nach oben zu gehen.

Sie beginnen mit dem Wurzelelement und n = 0.

Verwandte Themen