3

Stax パーサーを使用して XML ファイルを読み取り、Java で DOM を使用してそれを書き込んでいます。必要な XML 出力が得られません。次のXMLファイルを読みました

<config>

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

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

</config>

上記の XML ファイルを 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();

        }
       }
     }

「Sensor1」および「Sensor2」クラスでは、条件に応じて追加情報を追加しています。

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>

私は自分のコードで何をしているのですか?? どんな助けでも大歓迎です。前もって感謝します

4

2 に答える 2

1

私は再び自分の質問に答えています。問題は非常に単純です。上記のように目的の出力を取得するには。「WriteFile」クラスに次の変更を加えるだけです。

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

最後に、私はJavaを学んでいます:)

于 2012-04-25T14:17:14.893 に答える
0

率直に言って、この例は面倒に見えます。jaxbのapacheダイジェスターを使用することを検討していますか?
http://commons.apache.org/digester/
http://www.oracle.com/technetwork/articles/javase/index-140168.html

于 2012-04-24T14:18:05.560 に答える