将 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
会随机截断为 944aa679441c818d80bd8c7
和
100000000
将 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();
}
我正在尝试使用以下代码使用 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
会随机截断为 944aa679441c818d80bd8c7
和
100000000
将 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();
}