1

我正在用 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);
    }

在某些消息项目中,您收到不正确的值,例如,当我解析标签 BODY 时,我得到'1 Some Text2'当我必须收到'Some text1 Some Text2'并且我找不到丢失的数据甚至打印控制台以这种方法接收的所有数据。

在消息 47 处,总是在相同位置剪切数据(在其他消息中,总是在相同位置)。我认为这个问题可能是因为角色在一瞬间调用了两次或更多,但我刚才说过,我看不到丢失的数据,甚至都打印到控制台。

你能帮我吗?

谢谢

4

1 回答 1

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();
}
于 2012-04-27T10:08:44.727 回答