2016-11-17 119 views
0

我使用遗留系统(而不是我的设计),它将一些数据作为序列化XML(SOAP)保存在数据库中。使用XDocument解析SOAP XML

XML是使用SoapFormatter创建的。

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

由于版本控制问题,我不能简单地反序列化SOAP。从中创建数据的模型已经发生变化,持久数据的反序列化(在xml中)是不可能的。所以我想弄清楚如何手动将旧SOAP“反序列化”到现有模型。

我可以加载到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. 

try代码:

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()); 


     } 
    } 
}