2017-04-21 26 views
0

ArrayListオブジェクトにXML要素の値があります。子ノードを持つ要素を持つ次の構造のXMLファイルを作成する必要があります。複数のサブ要素を持つXMLファイルを作成する

番号、名前、およびレベルが、それぞれ、arLylistオブジェクトalNumber、alNameおよびalLevelに追加されます。値は以下の順序でarraylistオブジェクトに追加されました。 XMLファイルの出力でなければなりません後

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 

.......

:ここ

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

は私のコードです:

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

しかし、あなたの問題は何ですか?何を試しましたか?これはあなたの宿題ですか?疑問符のない質問は質問ではありません。 – Obenland

+0

私はそのXMLファイルを作成しようとしています。しかし、それを必要な形式で印刷することができませんでした。 –

+0

レベル1と2はすべて私にとってうまくいくようです。しかし、それは失敗します。私はコードを書き直さなければならないと思います。私はあなたのアイデアを答えとして書いてくれるので、それにはもう少し時間がかかります。 – Obenland

答えて

1

ありがとうオベランド。これはnレベルでこのように機能しました。

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

私はあなたのコードを考えますあなたの問題のレベル1とレベル2の特別なケースを記述しているので動作しません。レベル3とレベル4を処理するコードを追加する必要があります。しかしレベル1337についてはどうですか?あなたはレベル1337までのあらゆるレベルのための余分なコードを書いてみたいですか?私はそうは思わない。最も一般的なシナリオを抽出してみてください:

私はレベルnのXML要素です。レベルmに追加する新しい要素があります。

新しい要素を追加するには、新しい要素を追加する必要があるレベルの上にある要素まで移動する必要があります。レベルm - 1です。新しい要素が追加され、その後レベルmの新しい要素になります。

getParentNode()を使用すると、1レベル上に移動できます。

したがって、2つのネストされたfor-loopsが必要です。最初はリストを反復し、第2の はn - (m - 1)レベルを上げるために使用する必要があります。

ルート要素で始まり、n = 0で始まります。

関連する問題