簡體   English   中英

RestSharp反序列化深度嵌套的XML文檔

[英]RestSharp deserialize deeply nested XML document

我一直在努力讓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; }
}

然后,我創建了以下單元測試( 靈感來自

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更改類名,那么一切似乎都可以正常工作。

XML在反序列化過程中區分大小寫。 快速解決這個問題,您可以嘗試

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

等您的每個元素名稱。

如果您要處理許多不同的xml文件,那么值得尋找對您有好處的東西。

nb,您還可以將“ Template中的屬性名稱從“ Coupon更改為“ Coupon COUPON

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM