使用tcp套接字解析Windows Phone 7上的xml内容
我正在开发Windows Phone 7的应用程序。
我有一个使用c#silverlight中的tcp套接字来解析xml流。 我正在尝试使用xmlreader和内存流,但它没有任何帮助。 当通过接收异步调用更新内存流时,xmlreader对该读取器没有影响。
请帮我解决如何从套接字解析流式xml。
我有一个xmlReader,这样:
memoryStream= new MemoryStream(); _xmlreader = XmlReader.Create(memoryStream, xmlReaderSettings, context);
现在memoryStream更新为:
byte []buffer = "initialized with some xml bytes such as data "
因为这个缓冲区是由套接字receiveasync操作填充的,它是xml。 现在我需要更新我的数据。 所以我这样做……
memoryStream = memoryStream.write(buffer,0,buffer.length);
现在,当我这样做_reader.read失败。 我不知道为什么会这样。 否则有xmlpullparser(sax)就像我们在android os中用于xml解析一样
while (_reader.Read()) { switch (_reader.NodeType) { case XmlNodeType.Element: { node = new XElement(_reader.Name); xmlBuildStack.Push(node); } break; case XmlNodeType.EndElement: .....
有没有其他方法可以解析来自tcp套接字流的xml,因为我正在使用xmpp xml节的聊天应用程序。 请帮我解决这个问题。
MemoryStream
无法按您希望的方式工作。 当XmlReader
读取到当前端(即消耗所有当前数据)时,它将报告它已到达文件末尾。
你真正需要的是在TCP套接字周围包装一个流。 可能最简单的方法是使用TcpClient而不是原始套接字。 GetStream
方法将执行您想要的操作 – 提供可以从中创建XmlReader
的流。
另一个选择是创建一种类型的流来完成你所要求的。 也就是说,它允许一个线程放入数据,另一个线程放出数据。 但是,在生产者说文件结束发生之前,消费者不报告文件结束。
几个月前我写了这样的东西并发表了这样的东西。 请参阅构建新类型的流 。
老实说,但在这种情况下, TcpClient
将是我的首选。
不幸的是,XmlReader对XMPP几乎没用。 它在处理任何输入之前缓冲到4kB,无论您连接到它的流。
即使作为第一个向自己certificate这一点的黑客,你也不应该写一个将每个入站节填充到4kB的流,但只能在节边界上。
为了解决这个问题,我将James Clark的XP解析器部分移植到了C#。 如果LGPL适合您,您可以将xpnet从jabber-net (我没有更新以支持WinPhone7)中拉出来,或者如果您使整个库工作,则向我发送补丁。