2016-11-17 2 views
0

Я работаю с устаревшей системой (а не с моим дизайном), и у нее есть некоторые данные, которые сохраняются в db как сериализованный xml (SOAP).Разбор SOAP XML с XDocument

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


     } 
    } 
} 
Смежные вопросы