2017-05-14 16 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

提案していただきありがとうございます。しかし、それはXElement.Parse(入力)と思われる。不完全なXML構造を解析しようとすると例外がスローされます。 –

+1

XMLでは、すべてのデータが発生するまで待つ必要があります。 xmlタグは閉じなければなりません。 TCPでは、メッセージは最大サイズ〜1500バイトのデータグラムに分割されます。最初にTCPを使うと、各メッセージがいつ終わるかを知り、メッセージ全体が受信されるまでTCPデータの読み取りを続ける必要があります。この場合、メッセージを末尾にを検索する部分に解析することができます。 – jdweng

+0

jdwengのように、私はのように 'empty'ノードではないことがありました: