2014-05-09 2 views
0

J'ai écrit du code qui crée un fichier XML à partir de mes propriétés système dans java. Cela fonctionne exactement comme je le veux mais je n'aime vraiment pas vraiment comment j'ai fini par utiliser comme si 5 instructions pour le faire fonctionner puisque j'ai remarqué qu'aucune des propriétés ne va au-delà de 4 sous-chaînes délimitées de toute façon. Id préfère de loin utiliser un itérateur et une sorte de méthode hasNext() pour continuer à ajouter des éléments jusqu'à la fin de la chaîne mais je n'ai rien pu faire. Je ne pouvais pas trouver un moyen d'ajouter le tag le plus récent sur le dernier dans une boucle/ajouter la valeur à la fin des éléments.Tentative de création d'un fichier XML avec itérateur dans java

C'est ce que j'ai actuellement comme une solution rapide pour lancer le programme.

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!"); 

Si quelqu'un a des idées sur la façon de faire un peu plus souple ou élégant de manière à prendre dans un certain nombre d'id sous-chaînes délimitées apprécierais.

+0

Pouvez-vous fournir l'entrée et la sortie par exemple. Merci. – Adam

Répondre

1

Je pense que c'est ce que vous voulez.

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)); 

sortie Exemple:

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

exemple de travail complet:

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

C'est parfait. Merci beaucoup. J'ai essayé plusieurs approches différentes, mais celle-ci ne m'est jamais venue à l'esprit. C'est tellement mieux. –

+0

Je trouve que le crayon et le papier font des miracles pour des problèmes compliqués - déterminez d'abord comment vous le faites à la main. – Adam