2012-04-24 148 views
3

我正在使用Stax解析器讀取XML文件,並使用Java中的DOM編寫它。我沒有得到所需的XML輸出。我讀下面的XML文件在java中讀取和寫入xml

<config> 

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

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

</config> 

我使用StAX解析器如下

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

     } 
     } 
    } 

在「傳感器1」和「傳感器2」類我加入這取決於一些條件的額外信息分析上面的XML文件。

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

    } 

} 

這是類編寫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"); 
} 

當我執行,我獲得以下XML

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

我最後的輸出必須

<config> 

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

我我在我的代碼做錯了什麼事?任何幫助表示讚賞。在此先感謝

+0

您可以簡化您的XML一點。你可以只有多個節點而不是? – eabraham 2012-04-24 13:49:09

回答

1

我再回答我的問題。問題很簡單。如上所述獲得所需的輸出。只需對「WriteFile」類進行以下更改即可。

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

最後,我學習Java :)