2012-08-14 98 views
1

我想从使用sax解析器的java中的xml文件中获取数据。我成功地获得了少量的数据,但是当数据变得太大并且在多行中时,它只给出两行数据,而不是所有行。我想下面的代码 -从xml读取多行

InputStreamReader isr = new InputStreamReader(is); 
InputSource source = new InputSource(isr); 
SAXParserFactory factory = SAXParserFactory.newInstance(); 
factory.setNamespaceAware(true); 
SAXParser parser = factory.newSAXParser(); 
XMLReader xr = parser.getXMLReader(); 
GeofenceParametersXMLHandler handler = new GeofenceParametersXMLHandler(); 
xr.setContentHandler(handler); 
xr.parse(source); 

而且我GeofenceParametersXMLHandler是 -

private boolean inTimeZone = false; 
private boolean inCoordinate = false; 
private boolean outerBoundaryIs = false; 
private boolean innerBoundaryIs = false; 
private String timeZone; 
private List<String> innerCoordinates = new ArrayList<String>(); 
private String outerCoordinates; 

public String getTimeZone() { 
    return timeZone; 
} 

public List<String> getInnerCoordinates() { 
    return innerCoordinates; 
} 

public String getOuterCoordinates() { 
    return outerCoordinates; 
} 

@Override 
public void characters(char[] ch, int start, int length) throws SAXException { 
    super.characters(ch, start, length); 
    if (this.inTimeZone) { 
     this.timeZone = new String(ch, start, length); 
     this.inTimeZone = false; 
    } 

    if (this.inCoordinate && this.innerBoundaryIs) { 
     this.innerCoordinates.add(new String(ch, start, length)); 
     this.inCoordinate = false; 
     this.innerBoundaryIs = false; 
    } 

    if (this.inCoordinate && this.outerBoundaryIs) { 
     this.outerCoordinates = new String(ch, start, length); 
     this.inCoordinate = false; 
     this.outerBoundaryIs = false; 
    } 
} 

@Override 
public void endElement(String uri, String localName, String name) throws SAXException { 
    super.endElement(uri, localName, name); 
} 

@Override 
public void startDocument() throws SAXException { 
    super.startDocument(); 
} 

@Override 
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { 
    super.startElement(uri, localName, name, attributes); 

    if (localName.equalsIgnoreCase("timezone")) { 
     this.inTimeZone = true; 
    } 

    if (localName.equalsIgnoreCase("outerBoundaryIs")) { 
     this.outerBoundaryIs = true; 
    } 

    if (localName.equalsIgnoreCase("innerBoundaryIs")) { 
     this.innerBoundaryIs = true; 
    } 

    if (localName.equalsIgnoreCase("coordinates")) { 
     this.inCoordinate = true; 
    } 
} 

和XML文件是 -

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2" 
xmlns:gx="http://www.google.com/kml/ext/2.2"> 

<Placemark> 
    <name>gx:altitudeMode Example</name> 
    <timezone>EASTERN</timezone> 
    <Polygon> 
     <extrude>1</extrude> 
     <altitudeMode>relativeToGround</altitudeMode> 
     <outerBoundaryIs> 
     <LinearRing> 
     <coordinates> 
     -77.05788457660967,38.87253259892824,100 
     -77.05465973756702,38.87291016281703,100 
     -77.05315536854791,38.87053267794386,100 
     -77.05552622493516,38.868757801256,100 
     -77.05844056290393,38.86996206506943,100 
     -77.05788457660967,38.87253259892824,100 
     </coordinates> 
    </LinearRing> 
    </outerBoundaryIs> 
</Polygon> 

我总是有两个行坐标数据。但是,当他们在单行中时,我获得了完整的数据。如何在多行中获取完整的数据?

在此先感谢。

回答

7

characters()方法不一定给你一次过全部文本数据(这是一个很普遍的误解,顺便说一句)。

适当的方法是级联()由连续调用返回到字符的所有的数据(用StringBuilder或类似的)。一旦你调用了endElement()方法,你就可以将该文本缓冲区视为完整并按照这种方式进行处理。

从DOC:

解析器将调用此方法来报告字符 每个数据块。 SAX解析器能够在一个单一的 块返回所有连续的字符数据,或者他们可以将其分割成若干块

你经常看到,一个小的XML文档调用一次characters()就足够了。然而,随着您的XML文档的大小增加,您会发现由于缓冲等原因,您将开始接收多个电话。因此,每一个独立处理的电话似乎都不完整。

+0

那么如何获得完整的数据? – 2012-08-14 11:01:20

+1

他写道,在未来的一段 – 2012-08-14 11:02:08

+0

下面是一个完整的例子http://www.java2s.com/Code/Java/XML/SAXDemo.htm – maneesh 2012-08-14 11:05:57