2012-04-24 6 views
3

Je suis en train de lire un fichier XML en utilisant Stax parser et en l'écrivant en utilisant DOM dans Java. Je ne reçois pas la sortie XML souhaitée. J'ai lu suivant fichier XMLLire et écrire un fichier XML en Java

<config> 

    <Sensor1> 
     <name>abc</name> 
     <range>100</range> 
    </Sensor1> 

    <sensor2> 
     <name>xyz</name> 
     <range>100</range> 
    </sensor2> 

</config> 

Je parser le fichier XML ci-dessus en utilisant l'analyseur Stax comme suit

public void readConfig(String configFile) { 
boolean sensor1 = false; 
boolean sensor2 = false; 

try 
{ 
    XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
    InputStream in = new FileInputStream(configFile); 
    XMLEventReader eventReader = inputFactory.createXMLEventReader(in); 

    // Read the XML document 
while (eventReader.hasNext()) { 
    XMLEvent event = eventReader.nextEvent(); 

    if (event.isStartElement()) { 

     StartElement startElement = event.asStartElement(); 

       if (startElement.getName().getLocalPart() == (sensor1)) { 

        sensor1 = true; 
        Sensor1 Obj1 = new Sensor1();       
     } 

      if (startElement.getName().getLocalPart() == (sensor2)) { 

         sensor2 = true; 
         Sensor2 Obj2 = new Sensor2(); 

       } 



    if (sensor1) { 

     if (event.asStartElement().getName().getLocalPart().equals(name)) { 

      event = eventReader.nextEvent(); 
        Obj1.set_Sensor_Name(event.asCharacters().getData()); 
      continue; 
     } 


     if (event.asStartElement().getName().getLocalPart().equals(range)) { 

      event = eventReader.nextEvent(); 
        Obj1.set_Sensor_Range(event.asCharacters().getData()); 
      continue; 
     } 
    } 


if (sensor2) { 

    if (event.asStartElement().getName().getLocalPart().equals(name)) { 
      event = eventReader.nextEvent(); 
      Obj2.set_Sensor_Name(event.asCharacters().getData()); 
      continue; 
     } 

     if (event.asStartElement().getName().getLocalPart().equals(range)) { 

      event = eventReader.nextEvent(); 
        Obj1.set_Sensor_Range(event.asCharacters().getData()); 
      continue; 
     } 


    } 

if (event.isEndElement()) { 
     EndElement endElement = event.asEndElement();  
     if (endElement.getName().getLocalPart() == (sensor1)) { 

        sensor1.addToArray(); 
     } 

     if (endElement.getName().getLocalPart() == (sensor2)) { 

        sensor2.addToArray(); 

     } 
     } 
    } 

Dans « Capteur1 » et « Capteur2 » classe J'ajoute des informations supplémentaires en fonction de certaines conditions.

class Sensor1 { 

    public ArrayList<Object> list = new ArrayList<Object>(); 
    String name; 
    double range; 

    public void set_Sensor_Name(String name) { 
    this.name = name; 

    } 

    public void set_Sensor_Range(double range) { 
    this.range = range; 

    } 

    public void addToArray(){ 
    double distance =50; 

    if(distance<range){ 
     list.add("TITANIC"); 
     list.add(123456); 
    } 

    WriteFile fileObj = new WriteFile(); 
    fileObj.writeXMlFile(list); 

    } 

} 

C'est la classe d'écrire le XML

public class WriteFile { 

public void writeXmlFile(ArrayList<Object> list) { 

try { 

    DocumentBuilderFactory dFact = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder build = dFact.newDocumentBuilder(); 
    Document doc = build.newDocument(); 

    Element root = doc.createElement("SensorTracks"); 
    doc.appendChild(root); 

    Element sensorInfo = doc.createElement("SensorDetails"); 
    root.appendChild(sensorInfo); 

    Element vesselInfo = doc.createElement("VesselDetails"); 
    root.appendChild(vesselInfo); 


    for(int i=0; i<list.size(); i +=4) { 

     Element name = doc.createElement("SensorName"); 
     name.appendChild(doc.createTextNode(String.valueOf(list.get(i)))); 
     sensorInfo.appendChild(name); 

     Element range = doc.createElement("SensorRange"); 
     name.appendChild(doc.createTextNode(String.valueOf(list.get(i+1)))); 
     sensorInfo.appendChild(range); 

     Element mmi = doc.createElement("shipname"); 
     mmi.appendChild(doc.createTextNode(String.valueOf(list.get(i+2)))); 
     vesselInfo.appendChild(mmi); 

     Element license = doc.createElement("license"); 
     license.appendChild(doc.createTextNode(String.valueOf(list.get(i+3)))); 
     vesselInfo.appendChild(license); 

    } 


    // Save the document to the disk file 
    TransformerFactory tranFactory = TransformerFactory.newInstance(); 
    Transformer aTransformer = tranFactory.newTransformer(); 

    // format the XML nicely 
    aTransformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); 

    aTransformer.setOutputProperty(
      "{http://xml.apache.org/xslt}indent-amount", "4"); 
    aTransformer.setOutputProperty(OutputKeys.INDENT, "yes"); 



    DOMSource source = new DOMSource(doc); 
    try { 
     FileWriter fos = new FileWriter("/home/ros.xml"); 
     StreamResult result = new StreamResult(fos); 
     aTransformer.transform(source, result); 

    } catch (IOException e) { 

     e.printStackTrace(); 
    } 



} catch (TransformerException ex) { 
    System.out.println("Error outputting document"); 

} catch (ParserConfigurationException ex) { 
    System.out.println("Error building document"); 
} 

Quand j'exécute, je me suit XML

<SensorTracks>   
    <sensorDetails> 
    <SensorName>xyz</SensorName> 
    <SensorRange>100</SensorRange> 
    </sensorDetails> 
<VesselDetails> 
     <shipname>TITANIC</shipname> 
     <license>123456</license> 
</vesselDetails> 

MA SORTIE FINALE DOIT ÊTRE

<config> 

<SensorTracks>   
    <sensorDetails> 
    <SensorName>xyz</SensorName> 
    <SensorRange>100</SensorRange> 
    <SensorName>abc</SensorName> 
    <SensorRange>100</SensorRange> 
    </sensorDetails> 
<VesselDetails> 
     <shipname>TITANIC</shipname> 
     <license>123456</license> 
</vesselDetails> 

Quelle mauvaise chose que je fais, je suis dans mon code ?? Toute aide est appréciée. Merci d'avance

+0

Pouvez-vous simplifier votre XML un peu. Pouvez-vous avoir plusieurs nœuds au lieu de et ? – eabraham

Répondre

1

Je réponds à ma question. Le problème est très simple. Pour obtenir la sortie désirée comme mentionné ci-dessus. faites juste les changements suivants à la classe "WriteFile".

FileWriter fos = new FileWriter("/home/ros.xml" ,true); 

Enfin, j'apprends Java :)

Questions connexes