1

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 から変更すると、すべて機能するようです。

4

1 に答える 1

1

XML は、逆シリアル化プロセスで大文字と小文字が区別されます。これをすばやく回避するには、試すことができます

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

要素名ごとになど。

多くの異なる xml ファイルを処理する場合は、それをうまく処理できるものを見つける価値があります。

nb、プロパティの名前をTemplateからCouponに変更することもできますCOUPON

于 2013-06-27T12:24:55.817 に答える