gpt4 book ai didi

java - XMLStreamReader 无法读取完整标签

转载 作者:行者123 更新时间:2023-12-01 11:41:18 26 4
gpt4 key购买 nike

我正在使用 XMLStreamReader 解析 XML 。在 <dbresponse>标签有一些从数据库加载的数据(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();

最佳答案

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

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

但是它读取的缓冲区不是无限的,因为它旨在处理大型 XML 文件,就像您拥有的那样。因此,标签中的大文本可能由几个连续的 CHARACTERS 事件表示。

也就是说,当您收到 CHARACTERS 事件时,不能保证它包含整个文本。如果文本对于阅读器的缓冲区来说太长,您只会收到更多的 CHARACTERS 事件。

由于您仅读取第一个 CHARACTERS 事件中的数据,因此它不是全部数据。

处理此类文件的正确方法是:

  • 当您收到您感兴趣的元素的 START_ELEMENT 事件时,您就准备存储文本。例如,创建一个StringBuilder,或者打开一个文件进行写入等。
  • 对于随后的每个 CHARACTERS 事件,您都将文本附加到存储(StringBuilder,即文件)中。
  • 一旦获得同一元素的 END_ELEMENT 事件,您就完成了数据的积累,并可以使用它执行您需要执行的操作。

事实上,这就是 getElementText() method 的意思为您做的事情 - 在处理 CHARACTERS 事件时将数据累积在 StringBuffer 中,直到到达 END_ELEMENT

底线:只有当您点击 END_ELEMENT 事件时,您才知道自己获得了完整数据。无法保证文本将出现在单个 CHARACTERS 事件中。

关于java - XMLStreamReader 无法读取完整标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29498587/

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