我正在使用SAX解析下一种类型的XML:
<?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[mail1@domain.com]]></TO>
<TO><![CDATA[mail2@domain2.com]]></TO>
</RECIPIENTS>
</MESSAGE>
<MESSAGE>
<SUBJECT><![CDATA[Some text]]></SUBJECT>
<BODY><![CDATA[Some text1 Some Text2 ]]></BODY>
<RECIPIENTS>
<TO><![CDATA[mail1@domain.com]]></TO>
<TO><![CDATA[mail2@domain2.com]]></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处,始终将数据切割到相同位置(在其他消息中也是如此,始终是相同的位置)。我认为这个麻烦可能是因为角色在一瞬间呼叫两次或更多,但我之前说过,我无法看到丢失的数据甚至打印到控制台。
你能帮我吗?
谢谢
答案 0 :(得分:6)
请注意,字符不保证一次性返回所有文本。在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();
}