2012-04-27 65 views
1

我用SAX解析下一个XML类型:XML SAX解析器数据丢失

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<ROOT> 
    <MESSAGES> 
     <MESSAGE> 
      <SUBJECT><![CDATA[Some text]]></SUBJECT> 
      <BODY><![CDATA[Some text Some Text ]]></BODY> 
      <RECIPIENTS> 
       <TO><![CDATA[[email protected]]]></TO> 
       <TO><![CDATA[[email protected]]]></TO> 
      </RECIPIENTS> 
     </MESSAGE> 
     <MESSAGE> 
      <SUBJECT><![CDATA[Some text]]></SUBJECT> 
      <BODY><![CDATA[Some text1 Some Text2 ]]></BODY> 
      <RECIPIENTS> 
       <TO><![CDATA[[email protected]]]></TO> 
       <TO><![CDATA[[email protected]]]></TO> 
      </RECIPIENTS> 
     </MESSAGE> 

      <!-- List of 50 MESSAGE ITEM--> 
    </MESSAGES> 

</ROOT> 

当字符的方法被调用,

public void characters(char buf[], int offset, int len) throws SAXException 
    { 
    String currentValue = new String(buf, offset, len); 
    System.out.println(currentValue); 
    } 

一些消息项目,Y收到incorret值,例如,当我解析标签BODY我得到'1 Some Text2'当我必须接收'一些text1一些Text2',我找不到丢失的数据甚至打印控制所有接收的数据用这种方法。

在消息47处,总是在相同的位置(以及在其他消息中,总是相同的位置)剪切数据。我觉得这个麻烦可能是因为角色在一会儿打电话两次或更多,但是我之前说过的话,我看不到丢失的数据,甚至打印到控制台。

你能帮助我吗?

谢谢

回答

5

请注意,字符不能保证一次返回所有文本。在BODY中的文本之后,您不能保证您收到所有文本,直到您收到结尾/ BODY,即它可以调用一次或多次字符。您需要将您聚到一起的文本添加到一起,例如在一个stringBuilder中:

StringBulder xmlText = new StringBuilder(); 

public void characters(char buf[], int offset, int len) throws SAXException 
{ 
    xmlText.append(buf, offset, len); 

} 

public void endElement(String uri, String localName, String qname) throws SAXException 
{ 
    System.out.println(xmlText.toString()); 
    xmlText = new StringBuilder(); 
}