2012-08-14 58 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