使用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)中拉出来,或者如果您使整个库工作,则向我发送补丁。