使用 XDocument 解析 SOAP XML

本文关键字:XML SOAP 解析 XDocument 使用 | 更新日期: 2023-09-27 18:18:23

我使用遗留系统(不是我的设计(,它有一些数据作为序列化的xml(SOAP(保留在数据库中。

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,但它看起来并不好。

谢谢

话筒

使用 XDocument 解析 SOAP XML

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

        }
    }
}