简体   繁体   English

在java中读取和编写xml

[英]Reading and writing an xml in java

I am reading an XML file using Stax parser and writing it using DOM in java. 我正在使用Stax解析器读取XML文件,并在java中使用DOM编写它。 I am not getting desired XML output. 我没有得到理想的XML输出。 I read following XML file 我读了以下XML文件

<config>

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

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

</config>

I parse the above XML file using Stax parser as follows 我使用Stax解析器解析上面的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();

        }
       }
     }

In "Sensor1" and "Sensor2" class I am adding extra information depending on some condition. 在“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);

  }

} 

This is the class to write the XML 这是编写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");
}

When I execute, I get following XML 当我执行时,我得到了XML

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

MY FINAL OUTPUT MUST BE 我的最终输出必须是

<config>

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

What wrong thing I am I doing in my code ?? 我在代码中做了什么错误? Any help is appreciated. 任何帮助表示赞赏。 Thanks in advance 提前致谢

I am answering my own question again. 我再次回答我自己的问题。 The problem is very simple. 问题很简单。 To get the desired output as mention above. 如上所述获得所需的输出。 just make the following changes to "WriteFile" class. 只需对“WriteFile”类进行以下更改。

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

Finally, I am learning Java :) 最后,我正在学习Java :)

Frankly speaking the example looks cumbersome. 坦率地说,这个例子看起来很麻烦。 Do you consider to use apache digester of jaxb? 你考虑使用jaxb的apache消化器吗?
http://commons.apache.org/digester/ http://commons.apache.org/digester/
http://www.oracle.com/technetwork/articles/javase/index-140168.html http://www.oracle.com/technetwork/articles/javase/index-140168.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM