【问题标题】:convert text file to xml in java在java中将文本文件转换为xml
【发布时间】:2012-03-17 01:19:29
【问题描述】:

我有一个包含以下条目的文本文件

1 
244699000
52.467286666666666
4.611188333333334

我想将其转换为如下所示的 XML 文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<SYSTEM-TRACKS> 
<AIS-SENSOR ID ="1">
    <MMSI>244699000 </MMSI>
    <LATITUDE> 52.467286666666666 </LATITUDE>
    <LONGITUDE> 4.611188333333334 </LONGITUDE>  
</AIS-SENSOR> 
</SYSTEM-TRACKS>

这是我找到的代码

public class ToXML {

BufferedReader in;
StreamResult out;

TransformerHandler th;
AttributesImpl atts;

public static void main(String args[]) {
    new ToXML().doit();
}

public void doit() {
    try {
        in = new BufferedReader(new FileReader("data"));
        out = new StreamResult("data.xml");
        initXML();
        String str;

        while ((str = in.readLine()) != null) {

            process(str);

        }
        in.close();
        closeXML();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void initXML() throws ParserConfigurationException,
        TransformerConfigurationException, SAXException {
    // JAXP + SAX
    SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory
            .newInstance();

    th = tf.newTransformerHandler();
    Transformer serializer = th.getTransformer();
    serializer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
    // pretty XML output
    serializer.setOutputProperty(
            "{http://xml.apache.org/xslt}indent-amount", "4");
    serializer.setOutputProperty(OutputKeys.INDENT, "yes");
    th.setResult(out);
    th.startDocument();
    atts = new AttributesImpl();
    th.startElement("", "", "SYSTEM-TRACKS", atts);

}

public void process(String s) throws SAXException {
    String elements[] = s.split("\\r?\\n");
    atts.clear();

    th.startElement("", "", "AIS-SENSOR", atts);
    th.characters(elements[0].toCharArray(), 0, elements[0].length());

    th.startElement("", "", "MMSI", atts);
    th.characters(elements[1].toCharArray(), 0, elements[1].length());
    th.endElement("", "", "MMSI");

    th.startElement("", "", "LATITUDE", atts);
    th.characters(elements[2].toCharArray(), 0, elements[2].length());
    th.endElement("", "", "LATITUDE");

    th.startElement("", "", "LONGITUDE", atts);
    th.characters(elements[3].toCharArray(), 0, elements[3].length());
    th.endElement("", "", "LONGITUDE");

}

public void closeXML() throws SAXException {
    th.endElement("", "", "AIS-SENSOR");
    th.endElement("", "", "SYSTEM-TRACKS");
    th.endDocument();
}

}

但是当我执行它时,我得到以下错误

java.lang.ArrayIndexOutOfBoundsException: 1
at ToXML.process(ToXML.java:76)
at ToXML.doit(ToXML.java:38)
at ToXML.main(ToXML.java:26)

谁能帮我制作一个正确的 XML 文件,如上所示??

提前致谢

【问题讨论】:

  • ArrayIndexOutOfBoundsException:抛出该异常以指示使用非法索引访问了数组。索引为负数或大于或等于数组的大小。 docs.oracle.com/javase/1.4.2/docs/api/java/lang/…
  • 为什么不使用调试器自己缩小问题范围呢? (如果你不知道怎么做,我非常建议你学习它,因为它肯定比在这里提问要快)
  • 看看第 76 行,它是如何访问超出其大小的数组位置的? (这是非常基本的,突出显示第 76 行不会对您造成伤害,因为我当然不会将您的代码加载到编辑器中自己弄清楚)
  • 我希望您正在加载一个空白行,因此拆分不会是您期望的数组。
  • 那么您从这些建议中发现了什么?有什么解决办法吗?

标签: java xml


【解决方案1】:

您只使用文件中的一行来调用 process,然后尝试用新行拆分。您的数组的长度可能为 1。

String tmp = "";
while ((str = in.readLine()) != null) 
{
    tmp += str;
}
process(tmp);

试试这个吧。

【讨论】:

  • 这种方法只有在你有一组四个值的情况下才有效,因为他在process方法中没有循环。
【解决方案2】:

你的方法很奇怪。您正在逐行读取,然后逐行拆分,但每行只有一个值,因此您的拆分只会返回一个条目。我建议这种方法:

    String str;
    int counter = -1;
    while ((str = in.readLine()) != null) {
        counter++;
        if(counter % 4 == 0) {
            process1(str); // add AIS-SENSOR element
            continue;
        }
        if(counter % 4 == 1) {
            process2(str); // add MMSI element
            continue;
        }
        if(counter % 4 == 2) {
            process3(str); // add LATITUDE element
            continue;
        }
        if(counter % 4 == 3) {
            process4(str); // add LONGITUDE element and close AIS-SENSOR
            continue;
        }          
    }

counter 跟踪文件中的当前行。每个process1 都会根据相应行的值添加不同的元素。

【讨论】:

    【解决方案3】:

    首先在 doit() 你从你的文件中读取一行(这意味着你的第一个换行符) 那么你将在 linebreals 上拆分读取行。

    所以拆分总​​是会给出一个长度为 1 的数组,当您使用索引 1(数组中的第二个元素)时,这会导致异常。

    您的 txt 文件应该在 1 行中包含所有 4 行,或者您应该重写代码以按原样处理 txt 文件。

    【讨论】:

      【解决方案4】:

      像这样将文本文件读入 XML:

      void readXML(){
          File textFile=...
          Scanner scanner= new Scanner(textFile);
          ContentHandler xmlContentHandler xml=...
         //make sure to startDocument() with xmlContentHandler 
      
          while (scanner.hasNext()){
              addStartNodeWithAttribute("AIS-SENSORD", scanner.next());
      
              //move these to a method and use a for loop i=0..<3
              xmlContentHandler.startElement("","","MMSI",new AttributesImpl());
              String mmsi=scanner.next();
              contenthandler.characters(mmsi.toCharArray(), 0, mmsi.length());
              contenthandler.endElement("","","MMSI");
      
              xmlContentHandler.startElement("","","LATITUDE",new AttributesImpl());
              String lat=scanner.next();
              contenthandler.characters(lat.toCharArray(), 0, lat.length());
              contenthandler.endElement("","","LATITUDE");
      
              xmlContentHandler.startElement("","","LONGITUDE",new AttributesImpl());
              String long=scanner.next();
              contenthandler.characters(long.toCharArray(), 0, long.length());
              contenthandler.endElement("","","LONGITUDE");
          }
      
          //make sure to endDocument() with xmlContentHandler
      }
      

      【讨论】:

        【解决方案5】:

        使用 DOM:

        DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
        DocumentBuilder b = f.newDocumentBuilder();
        DOMImplementation i = b.getDOMImplementation();
        Document d = i.createDocument( null , null , null );
        

        然后,只需添加节点即可构建它:

        d.appendChild( d.createElement( ... ) ... );
        

        【讨论】:

          【解决方案6】:
          // This is the original coding with the necessary changes to make it work.
          // 1. Out destination is a FileWriter
          // 2. Read the 4 lines into an array.
          // 3. Process the array.
          //      patrice_cotte@hotmail.com
          package com.my.package;
          
          import java.io.BufferedReader;
          import java.io.FileReader;
          import java.io.FileWriter;
          
          import javax.xml.parsers.ParserConfigurationException;
          import javax.xml.transform.OutputKeys;
          import javax.xml.transform.Transformer;
          import javax.xml.transform.TransformerConfigurationException;
          import javax.xml.transform.sax.SAXTransformerFactory;
          import javax.xml.transform.sax.TransformerHandler;
          import javax.xml.transform.stream.StreamResult;
          
          import org.xml.sax.SAXException;
          import org.xml.sax.helpers.AttributesImpl;
          
          /* 
           * This program reads a 4 lines text file land creates an XML structure around
           * the raw data. The XML structure is then copied to an xml output file. 
           */
          public class Txt2XML {
          
              BufferedReader in;
              StreamResult out;
          
              TransformerHandler th;
              AttributesImpl atts;
          
              // Here's our entry point ... 
              public static void main(String args[]) {
                  new Txt2XML().doit();
              }
          
              public void doit() {
                  try {
                      in = new BufferedReader(new FileReader("conf/testdata.txt"));
                      out = new StreamResult(new FileWriter("conf/testdata.xml"));
                      initXML();
                      String str;
                      // declare an array that can contain 4 strings
                      String[] SArray=new String[4];
                      int i = 0;
          
                      while ((str = in.readLine()) != null) {
          //              System.out.println("input line: " + str);
                          SArray[i]=str;
                          i++;
          
                      }
          
                      process(SArray);
          
                      in.close();
                      closeXML();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          
              public void initXML() throws ParserConfigurationException,
                      TransformerConfigurationException, SAXException {
                  // JAXP + SAX
                  SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory
                          .newInstance();
          
                  th = tf.newTransformerHandler();
                  Transformer serializer = th.getTransformer();
                  serializer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
                  // pretty XML output
                  serializer.setOutputProperty(
                          "{http://xml.apache.org/xslt}indent-amount", "4");
                  serializer.setOutputProperty(OutputKeys.INDENT, "yes");
                  th.setResult(out);
                  th.startDocument();
                  atts = new AttributesImpl();
                  th.startElement("", "", "SYSTEM-TRACKS", atts);
          
              }
          
              public void process(String[] elements) throws SAXException {
          //      System.out.println("number of elements: " + elements.length);
                  atts.clear();
          
                  th.startElement("", "", "AIS-SENSOR", atts);
                  th.characters(elements[0].toCharArray(), 0, elements[0].length());
          
                  th.startElement("", "", "MMSI", atts);
                  th.characters(elements[1].toCharArray(), 0, elements[1].length());
                  th.endElement("", "", "MMSI");
          
                  th.startElement("", "", "LATITUDE", atts);
                  th.characters(elements[2].toCharArray(), 0, elements[2].length());
                  th.endElement("", "", "LATITUDE");
          
                  th.startElement("", "", "LONGITUDE", atts);
                  th.characters(elements[3].toCharArray(), 0, elements[3].length());
                  th.endElement("", "", "LONGITUDE");
          
              }
          
              public void closeXML() throws SAXException {
                  th.endElement("", "", "AIS-SENSOR");
                  th.endElement("", "", "SYSTEM-TRACKS");
                  th.endDocument();
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多