2012-04-24 5 views
3

Stax 파서를 사용하여 XML 파일을 읽고 Java에서 DOM을 사용하여 작성했습니다. 원하는 XML 출력을 얻지 못했습니다. 나는 "센서 1"과 "센서 2"클래스 내가 어떤 조건에 따라 추가 정보를 추가하고에서자바에서 xml 읽기 및 쓰기

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

     } 
     } 
    } 

을 다음과 같이 STAX 파서를 사용하여 위의 XML 파일을 구문 분석 XML 파일

<config> 

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

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

</config> 

다음 읽기.

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

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

다음 얻을 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"); 
} 

를 작성하는 클래스입니다 MY 최종 출력은 반드시

나는 내 코드에서 무엇을하고 무슨 일 것

<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

답변

1


나는 다시 내 자신의 질문에 대답하고있다. 문제는 매우 간단합니다. 위에서 언급 한대로 원하는 출력을 얻으려면. "WriteFile"클래스를 다음과 같이 변경하십시오.

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

마지막으로, 나는 자바 :)이