2017-05-14 27 views
0

我需要解析来自TCP/IP连接的标准XML结构。数据保存为字符串变量。这意味着在任何给定的时间里,我手上的数据都可能是不完整的(一个不完整的XML结构),或者是一个完整的XML结构(剩余不完整)(下一个XML结构的开始)。解析来自TCP/IP连接的XML字符串

大部分结构都没有“空”:

<Message> 
    <Param1 value = "val1"/> 
    <Param2 value = "val2"/> 
</Message> 

但也有“空”的:

<Message status="ack" /> 

因此,只要寻找</Message>,使分裂没有好足够。

如何从下一个部分结构中分出完整的结构?除了为此创建自己的状态机并逐字节地检查外,是否有更简洁的解决方案?

+0

也许这可以帮助:http://stackoverflow.com/questions/55828/how-does-one-parse-xml-files?rq=1 –

+0

这里最大的问题是部分xml结构不是xml结构,它们是无效的标记。无论如何,你可以摆脱xml? –

+1

听起来你应该在更高级别的协议上工作,以便知道需要多少字节,并且可以清楚地区分文档。这是你控制的协议吗? –

回答

0

您可以使用字典的每个消息

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = 
       "<Message>" + 
        "<Param1 value = \"val1\"/>" + 
        "<Param2 value = \"val2\"/>" + 
       "</Message>" + 
       "<Message>" + 
        "<Param1 value = \"val1\"/>" + 
        "<Param2 value = \"val2\"/>" + 
       "</Message>"; 


      XElement message = 
       new XElement("Root", input); 

      var results = message.Elements("Message") 
       .Where(x => x.HasElements) 
       .Select(x => x.Elements() 
        .GroupBy(y => y.Name.LocalName, z => z) 
        .ToDictionary(y => y.Key, z => (string)z.FirstOrDefault() 
         .Attribute("value"))) 
       .ToList(); 
     } 
    } 
} 
+0

谢谢你的建议jdweng。但是,似乎XElement.Parse(输入);尝试解析不完整的XML结构时引发异常。 –

+1

使用XML,您必须等待所有数据的发生。 xml标签必须关闭。使用TCP时,消息被分解为最大大小为1500字节的数据报。因此,首先使用TCP,您需要知道每个消息何时终止,并继续读取TCP数据,直到收到整个消息。在这种情况下,您可以将消息解析为搜索作为终结符。 – jdweng

+0

jdweng,我本来可以搜索是不是'空'节点,如: