将 StAX 与 OkHttp3 一起用于解析大型 SOAP 响应时发生数据泄漏

Data leak while using StAX with OkHttp3 for parsing large SOAP responses

我正在尝试使用以下代码使用 StAX 解析器解析多个大型 XML SOAP 响应(跟踪器是一个用于跟踪当前 XPATH 的简单堆栈):

XMLInputFactory factory = XMLInputFactory.newInstance()

while (true) {
    /*
     * <-- Request code -->
     */

    Response response = client.newCall(request).execute();
    InputStream responseReader = response.body().byteStream();
    XMLEventReader eventReader = factory.createXMLEventReader(responseReader);

    while (eventReader.hasNext()) {
        XMLEvent event = eventReader.nextEvent();

        if (event.getEventType() == XMLStreamConstants.START_ELEMENT) {
            StartElement startElement = event.asStartElement();
            String elementBuffer = startElement.getName().getLocalPart();
            tracker.push(elementBuffer);
            String currentXPath = tracker.getXPath(); //Joins all elements in the stack with '/' as delimiter.

            if (eventReader.peek().getEventType() == XMLStreamConstants.CHARACTERS) {
                String data = eventReader.nextEvent().asCharacters().getData().replace('\n', ' ');

                if (currentXPath.equals("/ABC/DEF/GHI"))
                    // Do something
                if (currentXPath.equals("/JKL/MNO/PQR"))
                    // Do something

                /*
                 * Remaining operations
                 */
            }
        } else if (event.getEventType() == XMLStreamConstants.END_ELEMENT) {
            tracker.pop();
        }
    }

    eventReader.close();
    responseReader.close();
    response.close();
}

问题: data 字符串从末尾被截断,我随机丢失数据。

示例: 944aa679441c818d80bd8c7d7001229e 会随机截断为 944aa679441c818d80bd8c7100000000 将 trim 降至 10000

任何人都可以指出这段代码有什么问题吗?我尝试浏览 StAX 和 OkHttp 文档,但一无所获。

谢谢!

已修复:

XMLInputFactory factory = XMLInputFactory.newInstance()

while (true) {
    /*
     * <-- Request code -->
     */

    Response response = client.newCall(request).execute();
    InputStream responseReader = response.body().byteStream();
    XMLEventReader eventReader = factory.createXMLEventReader(responseReader);

    while (eventReader.hasNext()) {
        XMLEvent event = eventReader.nextEvent();

        if (event.getEventType() == XMLStreamConstants.START_ELEMENT) {
            StartElement startElement = event.asStartElement();
            String elementBuffer = startElement.getName().getLocalPart();
            tracker.push(elementBuffer);
            String currentXPath = tracker.getXPath(); //Joins all elements in the stack with '/' as delimiter.

            if (eventReader.peek().getEventType() == XMLStreamConstants.CHARACTERS) {
                String data = "";
                
                while(eventReader.peek().getEventType() == XMLStreamConstants.CHARACTERS)
                    data += eventReader.nextEvent().asCharacters().getData().replace('\n', ' ');

                if (currentXPath.equals("/ABC/DEF/GHI"))
                    // Do something
                if (currentXPath.equals("/JKL/MNO/PQR"))
                    // Do something

                /*
                 * Remaining operations
                 */
            }
        } else if (event.getEventType() == XMLStreamConstants.END_ELEMENT) {
            tracker.pop();
        }
    }

    eventReader.close();
    responseReader.close();
    response.close();
}