gpt4 book ai didi

android - 从套接字读取大量 xml 数据并即时解析

转载 作者:搜寻专家 更新时间:2023-11-01 09:12:44 24 4
gpt4 key购买 nike

我正在开发一个 android 客户端,它通过 TCP 套接字从我的 java 服务器读取连续的 xml 数据流。服务器发送一个 '\n' 字符作为连续响应之间的分隔符。下面给出了一个模型实现..

<response1>
<datas>
<data>
.....
.....
</data>
<data>
.....
.....
</data>
........
........
</datas>
</response1>\n <--- \n acts as delimiter ---/>
<response2>

<datas>
<data>
.....
.....
</data>
<data>
.....
.....
</data>
........
........
</datas>
</response2>\n

好吧,我希望现在结构清晰了。此响应是从服务器 zlib 压缩后传输的。所以我必须首先膨胀我从服务器读取的任何内容,使用定界符和解析将响应分开。 我正在使用 SAX 来解析我的 XML

现在我的主要问题是来自服务器的 xml 响应可能非常大(可能在 3 到 4 MB 的范围内)。所以

  • 根据分隔符 (\n) 分隔响应我必须使用stringBuilder 在从套接字读取时存储响应 block 在某些手机上,StringBuilder 无法将字符串存储在兆字节范围。它给出了 OutOfMemory 异常,并且从像this这样的话题我开始知道保持大弦(即使在临时基础)不是一个好主意。

  • 接下来我尝试传递 inflatorReadStream(它反过来获取数据来自套接字输入流)作为 SAX 解析器的输入流(没有懒得自己分离xml,依赖SAX的查找能力基于标签的文档结尾)。这次得到一个回应解析成功,但随后找到 '\n' 分隔符 SAX在文档后抛出 ExpatParserParseExceptionjunk元素 .

  • 在捕捉到 ExpatParserParseException 之后,我尝试阅读再次,但在抛出异常后 SAX Parser 关闭流,所以当我再次尝试读取/解析时,它给出了 IOException 说输入流已关闭。

下面给出了我所做的代码 fragment (为清楚起见,删除了所有不相关的 try catch block )。

private Socket clientSocket     =   null;
DataInputStream readStream = null;
DataOutputStream writeStream = null;
private StringBuilder incompleteResponse = null;
private AppContext context = null;


public boolean connectToHost(String ipAddress, int port,AppContext myContext){
context = myContext;
website = site;
InetAddress serverAddr = null;

serverAddr = InetAddress.getByName(website.mIpAddress);

clientSocket = new Socket(serverAddr, port);

//If connected create a read and write Stream objects..
readStream = new DataInputStream(new InflaterInputStream(clientSocket.getInputStream()));
writeStream = new DataOutputStream(clientSocket.getOutputStream());

Thread readThread = new Thread(){
@Override
public void run(){
ReadFromSocket();
}
};
readThread.start();
return true;
}


public void ReadFromSocket(){
while(true){
InputSource xmlInputSource = new InputSource(readStream);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = null;
XMLReader xr = null;
try{
sp = spf.newSAXParser();
xr = sp.getXMLReader();
ParseHandler xmlHandler = new ParseHandler(context.getSiteListArray().indexOf(website), context);
xr.setContentHandler(xmlHandler);
xr.parse(xmlInputSource);
// postSuccessfullParsingNotification();
}catch(SAXException e){
e.printStackTrace();
postSuccessfullParsingNotification();
}catch(ParserConfigurationException e){
e.printStackTrace();
postSocketDisconnectionBroadcast();
break;
}catch (IOException e){
postSocketDisconnectionBroadcast();
e.printStackTrace();
e.toString();
break;
}catch (Exception e){
postSocketDisconnectionBroadcast();
e.printStackTrace();
break;
}
}
}

现在我的问题是

  1. 有没有办法让 SAX 解析器在打开后忽略垃圾字符xml 响应,而不是抛出异常并关闭流..
  2. 如果不是,有什么方法可以避免内存不足错误字符串生成器。坦率地说,我不排除对这个。有什么解决方法吗?

最佳答案

  1. 您可以在读取器周围使用包装器或将流传递给检测换行符的过滤器,然后关闭解析器并启动继续处理流的新解析器:您的流不是有效的 XML,您赢了' 能够像您当前实现的那样解析它。看看http://commons.apache.org/io/api-release/org/apache/commons/io/input/CloseShieldInputStream.html .
  2. 没有。

关于android - 从套接字读取大量 xml 数据并即时解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7074036/

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