gpt4 book ai didi

java - STAX API读取二进制数据

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:51 28 4
gpt4 key购买 nike

我正在使用 STAX 事件 API 读取从 SOAP 调用接收到的二进制数据,并希望将其流式传输给使用者。 SOAP 调用的 XML 有效负载如下所示:

    .........
<BinaryObject mimeCode="text/xml">PHNvYXAtZW52OkVudmVsb3BlIHhtbG5zOnNvYXAtZW52PSJodHRwOi8vc
2NoZW1hcy54bWxzb2FwLhm9yZy9zb2FwL2VudmVsb3BlLyI+DQogICA8c29hcC1lbnY6SGVhZGVy
Lz4NCiAgIDxzb2FwLWVudjpCb2R5Pg0KICAgICAgPG5tOkF0dGFjaG1lbnRGb2xkZXJEb2N1bWVudE
ZpbGVDb250ZW50QnlJRFJlc3BvbnNlX3N5bmMgeG1sbnM6bm09Imh0dHA6Ly9zYXAuY29tL3hpL1NB
UEdsb2JhbDIwL0dsb2JhbCIgeG1sbnM6cHJ4PSJ1cm46c2FwLmNvbTpwcm94eTpISlc6LzFTQUkvVE
FTMEIzNDE4MTJBNTc5MDUyM0I5RTU6ODA0Ij4NCiAgICAgICAgIDxBdHRhY..... </BinaryObject>

下面是我用来解析数据并将数据发送给消费者的java代码

    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);

InputStream in;

try {

in = new ByteArrayInputStream(response.getBytes());

XMLEventReader eventReader;
eventReader = inputFactory.createXMLEventReader(in);

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

// Start element
if (event.isStartElement()) {
StartElement startElement = event.asStartElement();

if (startElement.getName().getLocalPart().toString()
.equals("BinaryObject")) {

Iterator<Attribute> attributes = startElement
.getAttributes();

while (attributes.hasNext()) {
Attribute attribute = attributes.next();

if (attribute.getName().toString()
.equals("mimeCode")) {
mimeType = attribute.getValue();
}
}

event = eventReader.peek();

if (event.isCharacters()) {
event = eventReader.nextEvent();
content = event.asCharacters().getData();
}
}
}
}

} catch (XMLStreamException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

m_servletResponse.setContentType(mimeType);
m_servletResponse.getWriter().print(javax.xml.bind.DatatypeConverter
.printBase64Binary(content.getBytes()));

此代码存在多个问题:

  1. 对于较大的文件 (> 1 MB),我收到 StackOverflow 错误

  2. 即使对于较小的文件,当我尝试使用 png 文件时,我也会收到文件无效(在消费者处)的错误。

如何克服这些问题?

PS:我是第一次使用 STAX!

====================编辑:====================**

根据下面 Evgeniy 的建议,我现在能够处理小文件(例如 PNG)。然而,对于大型 PDF 文档 > 1 MB,我收到以下错误。关于这里出了什么问题有什么想法吗?

2012 12 09 06:50:19#+00#ERROR#System.err##anonymous#http-bio-8041-exec-9##seodportal#seodportal#web#null#null#线程“http-bio-8041-exec-9”中的异常 |2012 12 09 06:50:19#+00#ERROR#System.err##anonymous#http-bio-8041-exec-9##seodportal#seodportal#web#null#null#java.lang.StackOverflowError|2012 12 09 06:50:19#+00#ERROR#System.err##anonymous#http-bio-8041-exec-9##seodportal#seodportal#web#null#null# 在 com.sun.org.apache.xerces.internal.impl.XMLScanner.isInvalid(XMLScanner.java:1334)|2012 12 09 06:50:19#+00#ERROR#System.err##anonymous#http-bio-8041-exec-9##seodportal#seodportal#web#null#null# 在 com.sun.org.apache.xerces.internal.impl.XMLScanner.scanCharReferenceValue(XMLScanner.java:1294)|2012年12月9日06:50:19#+00#错误#System.err##anonymous#http-bio-8041-exec-9##seodportal#seodportal#web#null#null#在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl $FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java :3024)|2012年12月9日06:50:19#+00#错误#System.err##anonymous#http-bio-8041-exec-9##seodportal#seodportal#web#null#null#在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl $FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java :2919)|2012年12月9日06:50:19#+00#错误#System.err##anonymous#http-bio-8041-exec-9##seodportal#seodportal#web#null#null#在com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl $FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java :3059)|

最佳答案

首先,XMLEventReader是为特殊目的而设计的,请使用XMLStreamReader代替。这是一个工作示例

        XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
InputStream in = new ByteArrayInputStream(response.getBytes());
XMLStreamReader xr = inputFactory.createXMLStreamReader(in);
while (xr.hasNext()) {
int next = xr.next();
if (next == XMLStreamConstants.START_ELEMENT) {
if (xr.getLocalName().equals("BinaryObject")) {
String mimeCode = xr.getAttributeValue(null, "mimeCode");
if (mimeCode.equals("text/xml")) {
xr.next();
// for efficiency we can access xr inner buffer chars directly
char[] b = xr.getTextCharacters();
int textStart = xr.getTextStart();
int textLength = xr.getTextLength();
// or simply get it as String
String text = xr.getText();
// in this example I will use JDK's internal decoder com.sun.org.apache.xerces.internal.impl.dv.util.Base64
byte[] bytes = new Base64().decode(text);

}
}
}
}

关于java - STAX API读取二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13774883/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com