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
处理我的大文件,但由于某些原因它失败了。如果可能的话,请您看看这个问题并提供您的答案: