使用 tcp 套接字在 windows phone 7 上解析 xml 内容
Posted
技术标签:
【中文标题】使用 tcp 套接字在 windows phone 7 上解析 xml 内容【英文标题】:parsing xml content on windows phone 7 using tcp sockets 【发布时间】:2012-01-02 12:38:57 【问题描述】:我正在开发适用于 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 <node1> data </node1>"
因为这个缓冲区由 xml 的套接字接收异步操作填充。 现在我需要更新我的数据。所以我这样做...
memoryStream = memoryStream.write(buffer,0,buffer.length);
现在当我这样做时 _reader.read 失败。我不知道为什么会这样。否则是否有像我们在android os中用于xml解析的xmlpullparser(sax)一样的东西
while (_reader.Read())
switch (_reader.NodeType)
case XmlNodeType.Element:
node = new XElement(_reader.Name);
xmlBuildStack.Push(node);
break;
case XmlNodeType.EndElement:
.....
当我正在处理使用 xmpp xml 节的聊天应用程序时,是否有任何其他方法可以解析来自 tcp 套接字流的 xml。请帮我解决这个问题。
【问题讨论】:
嗨 Rakesh,你能试着澄清你的问题吗?您是否已经有一些代码可以分享,以显示您正在尝试做什么?这将使提供建议更容易。 尝试:先填充MemoryStream,再创建XmlReader。同时设置 stream.Position = 0;切换读/写时 我的流是一个 xml,它以碎片形式出现,即来自套接字的数据包。所以我需要用我收到的内容填充我的流。如果我先填充内存流然后创建 xmlreader。它不会完全填充目的。在第一次 receiveAsync 我得到一半的 xml 内容,在下一个 receiveAsyncs 我得到我的 xml需要附加到流中以使其成为正确的 xml 节的内容。如果这不是正确的方法,那我该怎么做。 不能每次收到新缓冲区时都创建一个新的 MemoryStream 和 XmlReader 吗? @KooKiz 实际上是 xml 内容来自 tcp 套接字。通过套接字到达的内容可能不是正确的 xml 内容,即 xml 可以在 2-3 次接收异步调用中到达。 【参考方案1】:不幸的是,XmlReader 对于 XMPP 几乎毫无用处。它在处理任何输入之前缓冲到 4kB,无论您连接到它的流是什么。
即使是第一次向自己证明这一点,您也不应该编写一个将每个入站节填充到 4kB 的流,而只能在节边界上。
为了解决这个问题,我将 James Clark 的 XP 解析器的部分内容移植到了 C#。如果 LGPL 适合您,您可以将 xpnet 从 jabber-net 中提取出来(我还没有更新以支持 WinPhone7),或者如果您让整个库正常工作,请向我发送补丁。
【讨论】:
:我扩展了流以将其与 XmlReader 一起使用 ..而且似乎工作正常。【参考方案2】:MemoryStream
无法按您希望的方式工作。当XmlReader
读取到当前末尾(即消耗所有当前数据)时,它会报告它已到达文件末尾。
您真正需要的是围绕 TCP 套接字包装一个流。可能最简单的方法是使用TcpClient 而不是原始套接字。 GetStream
方法会做你想做的事——提供一个流,你可以从中创建一个XmlReader
。
另一种选择是创建一种可以满足您要求的流。也就是说,它让一个线程输入数据,另一个线程取出数据。但是,直到生产者说文件结束,消费者才会报告文件结束。
几个月前我写并发表了类似的东西。见Building a New Type of Stream。
老实说,不过……TcpClient
在这种情况下是我的首选。
【讨论】:
Jim Mischel : TcpClient api 不适用于 windows phone 7 mango 版本。 @rakesh kumar:NetworkStream
呢? msdn.microsoft.com/en-us/library/…
@rakesh kumar:那么我看到的唯一解决方案是在创建MemoryStream
之前缓冲来自套接字的所有内容,或者使用我在那篇文章中展示的ProducerConsumerStream
之类的东西。
即使这样 XmlReader 将读取到最后,然后 xmlreader.read 将返回 false。
我尝试了你的(ProducerConsumerStream) 类,但是当我将它传递给 Xmlreader 时,它什么也没做。以上是关于使用 tcp 套接字在 windows phone 7 上解析 xml 内容的主要内容,如果未能解决你的问题,请参考以下文章