2012-02-27 134 views
-5

我有一个文本文件与以下条目转换文本文件,XML在java中

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文件?

在此先感谢

+0

ArrayIndexOutOfBoundsException异常:抛出以指示数组已被访问wi非法索引。索引或者是负数,或者大于或等于数组的大小。 http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/IndexOutOfBoundsException.html – VirtualTroll 2012-02-27 15:06:20

+4

为什么不使用调试器来自己缩小问题的范围?(如果你不知道怎么做,我非常建议你学习它,因为它肯定比在这里提问更快) – meriton 2012-02-27 15:09:22

+0

看看第76行,它如何访问外部大小的数组位置? (这是非常基本的,它不会伤害你突出显示第76行,因为我当然不会在编辑器中加载你的代码来自己弄清楚) – KevinDTimm 2012-02-27 15:09:41

回答

0

你调用过程从您的文件只是一个单一的线,然后尝试通过新线分割。您的阵列可能长度为1.

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

请尝试此操作。

+0

这种方法只有在你有一个由四个值组成的单一组时才会起作用,因为他在'process'方法中没有循环。 – Tudor 2012-02-27 15:16:06

0

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

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中的每一个将根据相应行上的值添加不同的元素。

0

首先在doit()你从你的文件中读取一行(这意味着打开你的第一个换行符) 然后你要在linebreals上拆分read line。

所以分割总是会给一个长度为1的数组,这会导致在使用索引1(数组中的第二个元素)时发生异常。

你的txt文件应该包含1行中的所有4行,看来你应该重写你的代码来处理txt文件。

0

阅读文本文件转换成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 
} 
+0

感谢您的建议... – user745475 2012-02-27 15:55:34

2

使用DOM:

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

然后,就建立它添加节点:

d.appendChild(d.createElement(...) ...); 
0
// 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. 
//  [email protected] 
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(); 
    } 
}