【问题标题】:RestSharp deserialize deeply nested XML documentRestSharp 反序列化深度嵌套的 XML 文档
【发布时间】:2013-06-27 20:45:32
【问题描述】:

我一直在努力让 RestSharp 解析以下返回的 XML 数据:

<?xml version="1.0" encoding="UTF-8"?>
<TICKETANYWHERE>
   <COUPON VER="1.0">
      <RESPONSE>
         <TEMPLATELIST>
            <TEMPLATE ID="000000001">
               <NAME>Some name</NAME>
            </TEMPLATE>
            <TEMPLATE ID="000000001">
               <NAME>Some other name</NAME>
            </TEMPLATE>
         </TEMPLATELIST>
      </RESPONSE>
   </COUPON>
</TICKETANYWHERE>

它是从 API 返回的,所以我无法更改这个 XML。我创建了以下类来对 XML 文件进行建模:

public class Template
{
    public string Id { get; set; }

    public string Name { get; set; }
}
public class TemplateList : List<Template>
{}

public class Response
{
    public TemplateList Templates { get; set; }
}
public class Coupon
{
    public decimal Ver { get; set; }

    public Response Response { get; set; }
}
public class TicketAnywhere
{
    public Coupon Coupon { get; set; }
}

然后我创建了以下单元测试 (inspired by)

var d = new XmlDeserializer();
var response = new RestSharp.RestResponse();
var XML = "<TICKETANYWHERE><COUPON VER=\"1.0\"><RESPONSE><TEMPLATELIST><TEMPLATE ID=\"00000001\"><NAME>Some name</NAME></TEMPLATE></TEMPLATELIST></RESPONSE></COUPON></TICKETANYWHERE>";
response.Content = XML;
var r = d.Deserialize<TicketAnywhere>(response);

但是,r.Coupon 为 NULL。我在这里做错了什么?

更新: 我试图通过将 XML 和测试更改为以下内容,将问题归结为最简单的形式:

    public class Template
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }

    public class TemplateList
    {
        public List<Template> Templates { get; set; }
    }

    [Test]
    public void AnotherTest()
    {
        var XML = @"<?xml version=""1.0"" encoding=""UTF-8""?>
        <TEMPLATELIST>
            <TEMPLATE ID=""00000001"">
                <NAME>Some name</NAME>
            </TEMPLATE>
            <TEMPLATE ID=""00000002"">
                <NAME>Some name</NAME>
            </TEMPLATE>
        </TEMPLATELIST>";

        var d = new XmlDeserializer();
        var response = new RestSharp.RestResponse();
        response.Content = XML;

        var r = d.Deserialize<TemplateList>(response);
        Assert.That(2, Is.EqualTo(r.Templates.Count));
    }

这又失败了。但是,如果我从 Template => TEMPLATE 更改类名,这一切似乎都有效。

【问题讨论】:

    标签: c# restsharp


    【解决方案1】:

    XML 在反序列化过程中区分大小写。要快速解决这个问题,您可以尝试

    XML = XML.Replace("COUPON", "Coupon");
    

    等你的每个元素名称。

    如果您要处理许多不同的 xml 文件,那么找到适合您的东西是值得的。

    nb,您还可以将 Template 中的属性名称从 Coupon 更改为 COUPON

    【讨论】:

    • 感谢您澄清区分大小写。请参阅我对问题的编辑。由于这是 API 返回的 XML,我真的无法替换内容,但是,如果大写我的类名可以解决问题,我担心这是他们要走的路,即使它很丑陋。谢谢您的帮助!! :)
    • 有一种方法可以使用 DeserializeAs 属性来装饰你的 c# 类,但是我还没有得到这个工作,所以不能粘贴它作为替代答案。
    • 好的。但实际上似乎可以将类和属性重命名为 CAPS。我应该将其作为替代答案发布,还是应该归功于您(您创建了替代答案)?
    • 好吧抱歉,我重命名了类,而不是属性。我将其添加为答案。您只需要重命名属性名称,而不是类。这样至少你的代码对你的呼喊少了一点。
    • 嗯,看起来 RestSharp 正在使用文字 xml 名称 (TEMPLATE) 来解析该类。如果我在 CAPS 中没有属性和类名,我的单元测试将失败。我想我只需要让我的代码对我大喊大叫......
    猜你喜欢
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多