【问题标题】:How to deserialize XML returned from REST API call?如何反序列化从 REST API 调用返回的 XML?
【发布时间】:2017-03-23 16:23:15
【问题描述】:

我被 RESTful API 调用反序列化返回的 XML 卡住了。 这是我收到的错误消息:

System.AggregateException :发生一个或多个错误。 ----> System.Runtime.Serialization.SerializationException:第 1 行出错 位置 106. 期望元素 'ArrayOfAPIUtility.PartInfo' 来自 命名空间 'http://schemas.datacontract.org/2004/07/MyProject.Web'.. 遇到名为“Part”、命名空间“”的“元素”。

我按照this stackoverflow 的回答创建了一个成功的 REST 连接。

返回的 XML 如下所示:

<Part>
    <ItemId>12345</ItemId>
    <ItemDescription>Item Description</ItemDescription>
    <Cost>190.59</Cost>
    <Weight>0.5</Weight>
</Part>

我正在尝试像这样反序列化它:

public class PartInfo
{
    public string ItemId { get; set; }
    public string ItemDescription { get; set; }
    public string Cost { get; set; }
    public string Weight { get; set; }
}

public void GetPartInfo(string itemId)
{
    var URL = ...some URL...;
    client.BaseAddress = new Uri(URL);

    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

    HttpResponseMessage response = client.GetAsync(urlParameters).Result;
    if (response.IsSuccessStatusCode)
    {
        var dataObjects = response.Content.ReadAsAsync<IEnumerable<PartInfo>>().Result;
        foreach (var d in dataObjects)
        {
            Console.WriteLine("{0}", d.ItemId);
        }
    }
}

结果就是上面粘贴的错误信息。

我想我在这里遗漏了一些非常基本的东西:-)

非常感谢您的帮助!

【问题讨论】:

  • 我怀疑这是因为您的类名“PartInfo”与标记名“Part”不匹配。我猜你要么必须注释类,所以 XML-Serialization 会知道它必须期待 TagName“Part”,或者你将类重命名为“Part”。
  • 感谢您的回复@Fildor!我将如何注释该类,以便 XML-Serialization 知道它必须期待 TagName“Part”?
  • 即使我将类名更改为public class Part,我仍然会收到与上面粘贴相同的错误消息。 @Fildor

标签: c# xml serialization


【解决方案1】:

试试 xml linq

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

namespace ConsoleApplication48
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);  //use parse instead if input is a string
            PartInfo partInfo = doc.Elements("Part").Select(x => new PartInfo()
            {
                ItemId = (string)x.Element("ItemId"),
                ItemDescription = (string)x.Element("ItemDescription"),
                Cost = (decimal)x.Element("Cost"),
                Weight = (double)x.Element("Weight")
            }).FirstOrDefault();

        }
    }
    public class PartInfo
    {
        public string ItemId { get; set; }
        public string ItemDescription { get; set; }
        public decimal Cost { get; set; }
        public double Weight { get; set; }
    }
}

【讨论】:

  • 感谢您的回复@jdweng,但我没有 XML 文件 :-)
  • 如果您阅读代码中的 cmets,您可以使用 Parse 读取字符串而不是文件。
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2023-03-11
  • 1970-01-01
  • 2019-11-21
相关资源
最近更新 更多