2016-11-17 11 views
0

私はレガシーシステム(自分のデザインではない)で動作し、シリアライズされたxml(SOAP)としてdbに保持されるデータがあります。XDocumentを使用したSOAP XMLの解析

XMLはSoapFormatterで作成されました。

SoapFormatter formatter = new SoapFormatter(); 
formatter.Serialize(stream, o); 

バージョン管理に問題があるため、SOAPから単純にデシリアライズすることはできません。データが作成されたモデルが変更され、永続化されたデータの逆シリアル化(xml)が不可能になりました。だから、古いSOAPを既存のモデルに手作業で「デシリアライズ」する方法を理解しようとしています。

IはXDocumentにロードした後、LINQでノード値を抽出することができます。しかし、私はGuidの値に問題があります。これらは、次のようにSOAP XMLに格納されます。

<someId xsi:type="a2:Guid" xmlns:a2="http://schemas.microsoft.com/clr/ns/System"> 
       <_a>1396006029</_a> 
       <_b>2720</_b> 
       <_c>20328</_c> 
       <_d>162</_d> 
       <_e>217</_e> 
       <_f>181</_f> 
       <_g>57</_g> 
       <_h>113</_h> 
       <_i>92</_i> 
       <_j>64</_j> 
       <_k>35</_k> 
      </someId> 

無痛化の方法はありますか?

var someId = xdoc.Descendants(ns + "root").Elements("someId").Elements("_a").Value; 

をし、GUIDに解析しようとするが、それは見栄えしません:

私はこのような一つずつを読むことができます。

おかげで、以下

マイク

答えて

0
I added <Root xmlns:xsi="abc"> to xml because the xsi namespace wan't defined. 

てみてくださいコード:

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

namespace ConsoleApplication28 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      Dictionary<string, int> dict = new Dictionary<string, int>(); 
      XDocument doc = XDocument.Load(FILENAME); 
      XElement someId = doc.Descendants("someId").FirstOrDefault(); 

      dict = someId.Elements().GroupBy(x => x.Name.LocalName, y => (int)y) 
       .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 


     } 
    } 
}