使用Android SAXParser,我的XML元素之一神秘地打破了一半

Fau*_*eal 2 java xml android sax stringreader

它不是'&'

我使用SAXParser对象确实解析了实际的XML.

这通常通过将URL传递给XMLReader.Parse方法来完成.因为我的XML来自对Web服务的POST请求,所以我将该结果保存为String,然后使用StringReader/InputSource将此字符串反馈回XMLReader.Parse方法.

但是,在XMLstring的第2001个字符处发生了一些奇怪的事情.
文档处理程序的'characters'方法在startElement和endElement方法之间被称为TWICE,有效地将我的字符串(在本例中为项目标题)分成两部分.因为我在我的character方法中实例化对象,所以我得到两个对象而不是一个.

这条线,大约2000个字符串进入字符串"两个字符串",在"低级"和"级别"之间断开

<title>SUMC-BOOKSTORE, LOWER LEVEL RENOVATIONS</title>
Run Code Online (Sandbox Code Playgroud)

当我绕过StringReader/InputSource变通方法并将平面XML文件提供给XMLReader.Parse时,它可以正常工作.

关于StringReader和/或InputSource的东西在某种程度上搞砸了.

这是我的方法,XML字符串和解析是通过SAXParser.

    public void parseXML(String XMLstring) {
    try {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(this);

        // Something is happening in the StringReader or InputSource 
        // That cuts the XML element in half at the 2001 character mark.

        StringReader sr = new StringReader(XMLstring);
        InputSource is = new InputSource(sr);
        xr.parse(is);


    } catch (IOException e) {
        Log.e("CMS1", e.toString());
    } catch (SAXException e) {
        Log.e("CMS2", e.toString());
    } catch (ParserConfigurationException e) {
        Log.e("CMS3", e.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

我非常感谢任何关于如何在XML字符串中达到这一点时没有"字符"触发的想法.

或者,告诉我如何使用POST请求并仍然将URL传递给Parse函数.

谢谢.

Pau*_*ham 5

正如donroby所说,解析器在startElement和endElement之间不止一次调用字符方法是完全合法的.然而,这根本不是"行为不端",你不应该试图去做事情,以免它发生.您的解析器似乎使用的是2000个字符的缓冲区,但还有其他原因可能会将文本节点分解为多个部分.

您应该做的是在您确定已经累积了节点的所有字符数据时,在endElement方法中在characters方法中累积数据并稍后处理它.