Java XMLStreamReader不';无法读取完整的标签

Java XMLStreamReader不';无法读取完整的标签,java,xml,Java,Xml,我正在使用XMLStreamReader解析XML。在标记中,有一些从数据库加载的数据(WebRowSet对象)。问题是这个标记的内容很长(比如说几百KB,数据是用Base64编码的),但是input.getText()只能从中读取16.394个字符 我100%确信XMLStreamReader中的数据是正常的。 我在这里找到了一些其他的答案,但这并不能解决我的问题,我当然可以用其他的方法来读取数据,但我想知道这个问题是什么 有人知道如何获取全部内容吗? 我的代码: in

我正在使用
XMLStreamReader
解析XML。在
标记中,有一些从数据库加载的数据(
WebRowSet
对象)。问题是这个标记的内容很长(比如说几百KB,数据是用Base64编码的),但是
input.getText()
只能从中读取16.394个字符

我100%确信
XMLStreamReader
中的数据是正常的。

我在这里找到了一些其他的答案,但这并不能解决我的问题,我当然可以用其他的方法来读取数据,但我想知道这个问题是什么

有人知道如何获取全部内容吗?

我的代码:

            input = xmlFactory.createXMLStreamReader(new ByteArrayInputStream(xmlData.getBytes("UTF-8")));

        while(input.hasNext()){
            if(input.getEventType() == XMLStreamConstants.START_ELEMENT){
                element = input.getName().getLocalPart();

                switch(element.toLowerCase()){
                    case "transactionresponse":
                        int transactionStatus = 0;

                        transactionResponse = new TransactionResponse(); 
                        for(int i=0; i<input.getAttributeCount(); i++){
                            switch(input.getAttributeLocalName(i)){
                                case "status": transactionStatus = TransactionResponse.getStatusFromName(input.getAttributeValue(i));
                            }
                        }

                        transactionResponse.setStatus(transactionStatus);

                        break;
                    case "dbresponse":
                        for(int i=0; i<input.getAttributeCount(); i++){
                            switch(input.getAttributeLocalName(i)){
                                case "request_id": id = Integer.parseInt(input.getAttributeValue(i)); break;
                                case "status": status = Response.getStatusFromName(input.getAttributeValue(i));
                            }
                        }

                        break;
                }
            }else if(input.getEventType() == XMLStreamConstants.CHARACTERS){
                switch(element.toLowerCase()){
                    case "dbresponse": 
                        String data = input.getText();

                        if(!data.equals("\n")){
                            data = new String(Base64.decode(data), "UTF-8");
                        }

                        Response response = new Response(data, status, id);

                        if(transactionResponse != null){
                            transactionResponse.addResponse(response);
                        }else{
                            this.addResponse(response);
                        }

                        id = -1;
                        status = -1;

                        break;
                }

                element = "";
            }else if(input.getEventType() == XMLStreamConstants.END_ELEMENT){
                switch(input.getLocalName().toLowerCase()){
                    case "transactionresponse": this.addTransactionResponse(transactionResponse); transactionResponse = null; break;
                }
            }

            input.next();
input=xmlFactory.createXMLStreamReader(新的ByteArrayInputStream(xmlData.getBytes(“UTF-8”));
while(input.hasNext()){
if(input.getEventType()==XMLStreamConstants.START\u元素){
元素=input.getName().getLocalPart();
开关(element.toLowerCase()){
案例“transactionresponse”:
int transactionStatus=0;
transactionResponse=新transactionResponse();

对于(int i=0;i我认为XMLStreamReader会对数据进行分块,所以可以尝试循环getText()来连接所有分块


那么getElementText()方法呢?

事件驱动的XML解析器(如
XMLStreamReader
)旨在允许您解析XML,而无需一次性将其读入内存,这对于拥有非常大的XML非常重要

设计是这样的,它读取特定的数据缓冲区,并在遇到“有趣”的东西时为您提供事件,例如标记的开头、标记的结尾等等

但它读取的缓冲区不是无限的,因为它是用来处理大型XML文件的,与您拥有的文件完全相同。因此,标记中的大型文本可能由几个连续的
字符
事件表示

也就是说,当您得到一个
字符
事件时,不能保证它包含整个文本。如果文本对于读取器的缓冲区来说太长,您将得到更多的
字符
事件

由于您仅从第一个
字符
事件读取数据,因此它不是全部数据

使用此类文件的正确方法是:

  • 当您获得感兴趣的元素的
    START\u元素
    事件时,您需要准备存储文本。例如,创建
    StringBuilder
    ,或打开文件进行写入等
  • 对于随后的每个
    字符
    事件,您将文本附加到存储中(文件
    StringBuilder
  • 一旦获得同一元素的
    END\u元素
    事件,您就完成了数据的积累,并对其执行任何需要执行的操作
事实上,这就是为您所做的-在执行
字符
事件时,在
字符串缓冲区
中累积数据,直到它到达
结束元素


一句话:只有在点击
END\u元素
事件时,您才知道您得到了全部数据。无法保证文本将出现在单个
字符
事件中。

检查。还要检查您是否完全读取了输入数据。您好,我也在使用
XmlStreamReader
处理我的大文件,但由于某些原因它失败了。如果可能的话,请您看看这个问题并提供您的答案: