2014-05-09 53 views
0

我編寫了一些代碼,用於從我的系統屬性中創建一個XML文件。它的工作原理是如何我想要它,但我真的(真的)不喜歡我如何結束只是使用5如果語句讓它工作,因爲我注意到沒有任何屬性超出4分隔子字串反正。 我更喜歡使用迭代器和某種hasNext()方法繼續追加到元素上,直到字符串結束,但我什麼都不能工作。 我無法找到一種方法將最新的標籤附加到循環中的最後一個標籤上/將值添加到元素的末尾。嘗試使用java中的迭代器構建XML文件

這是我目前作爲一個快速修復程序運行。

Document doc = docBuilder.newDocument(); 
    Element rootElement = doc.createElement("JAVA"); 
    doc.appendChild(rootElement); 

    Iterator it = hm.entrySet().iterator(); 
    while (it.hasNext()) 
    { 
     Map.Entry entry = (Map.Entry) it.next(); 
     String keyString = (String)entry.getKey(); 
     String val = (String)entry.getValue(); 
     java.util.List<String> sa = Arrays.asList(keyString.split("\\.")); 

     Iterator ait = sa.iterator(); 

     Element tag = doc.createElement((String) ait.next()); 
     rootElement.appendChild(tag); 

     Element tag2 = null; 
     Element tag3 = null; 
     Element tag4 = null; 
     Element tag5 = null; 

     while(ait.hasNext()) 
     { 
      if(ait.hasNext()) 
      {  
      tag2 = doc.createElement((String)ait.next()); 
      tag.appendChild(tag2); 
      if(!ait.hasNext()) 
       tag2.appendChild(doc.createTextNode(val)); 

      } 
      if(ait.hasNext()) 
      {  
      tag3=doc.createElement((String)ait.next()); 
      tag2.appendChild(tag3); 
       if(!ait.hasNext()) 
        tag3.appendChild(doc.createTextNode(val)); 
      } 
      if(ait.hasNext()) 
      {  
      tag4=doc.createElement((String)ait.next()); 
      tag3.appendChild(tag4); 
      if(!ait.hasNext()) 
       tag4.appendChild(doc.createTextNode(val)); 
      } 
      if(ait.hasNext()) 
      {  
      tag5=doc.createElement((String)ait.next()); 
      tag5.appendChild(tag5); 
      if(!ait.hasNext()) 
       tag5.appendChild(doc.createTextNode(val)); 
      } 

     } 

    } 

    Transformer transformer = null; 
    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    try 
    { 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(new File("XMLtester")); 

     transformer = transformerFactory.newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
     transformer.transform(source, result); 

    } catch (TransformerConfigurationException e) 
    { 
     e.printStackTrace(); 
    } catch (TransformerException e) 
    { 
     e.printStackTrace(); 
    } 
    catch(NullPointerException e) 
    { 
     System.out.println("ERROR: " + e.toString()); 
    } 
    System.out.println("File saved!"); 

如果任何人有關於如何使這一點更靈活或優雅,以便在任何數量的分隔子ID欣賞它的採取任何想法。

+0

你能提供例如輸入和輸出。謝謝。 – Adam

回答

1

我認爲這是你想要的。

Element destination = rootElement; 
Element tag = null; 
while (ait.hasNext()) { 
    tag = doc.createElement((String) ait.next()); 
    destination.appendChild(tag); 
    destination = tag; 
} 
destination.appendChild(doc.createTextNode(val)); 

輸出示例:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<JAVA> 
    <java> 
    <runtime> 
     <name>Java(TM) SE Runtime Environment</name> 
    </runtime> 
    </java> 
    <sun> 
    <boot> 
     <library> 
     <path>/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre/lib</path> 
     </library> 
    </boot> 
    </sun> 
    <java> 
    <vm> 
     <version>23.0-b19</version> 
    </vm> 
    </java> 
    <user> 
    <country> 
     <format>GB</format> 
    </country> 
    </user> 

全部工作示例:

import java.io.File; 
import java.util.Arrays; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 

public class StackOverflow23556822 { 

    public static void main(String[] args) throws ParserConfigurationException, 
      TransformerException { 
     DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance() 
       .newDocumentBuilder(); 
     Document doc = docBuilder.newDocument(); 
     Element rootElement = doc.createElement("JAVA"); 
     doc.appendChild(rootElement); 

     Iterator<?> it = System.getProperties().entrySet().iterator(); 
     while (it.hasNext()) { 
      Map.Entry<?, ?> entry = (Map.Entry<?, ?>) it.next(); 
      String keyString = (String) entry.getKey(); 
      String val = (String) entry.getValue(); 
      List<String> sa = Arrays.asList(keyString.split("\\.")); 

      Iterator<?> ait = sa.iterator(); 

      Element destination = rootElement; 
      Element tag = null; 
      while (ait.hasNext()) { 
       tag = doc.createElement((String) ait.next()); 
       destination.appendChild(tag); 
       destination = tag; 
      } 
      destination.appendChild(doc.createTextNode(val)); 

     } 

     Transformer transformer = null; 
     TransformerFactory transformerFactory = TransformerFactory 
       .newInstance(); 
     DOMSource source = new DOMSource(doc); 
     StreamResult result = new StreamResult(new File("xml-test.xml")); 

     transformer = transformerFactory.newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty(
       "{http://xml.apache.org/xslt}indent-amount", "2"); 
     transformer.transform(source, result); 

     System.out.println("File saved!"); 
    } 
} 
+0

這是完美的。非常感謝。我嘗試了許多不同的方法,但這個從來沒有找到我。這太好了。 –

+0

我發現鉛筆和紙的複雜問題的奇蹟 - 找出你如何做它首先手。 – Adam