From b3e1a3df201addd9fc8cfd24602db378251ab9b1 Mon Sep 17 00:00:00 2001 From: Wiebe Tijsma Date: Fri, 20 Jan 2012 13:54:02 +0100 Subject: [PATCH 1/2] XmlDeserializer.HandleListDerivative does not try the lowercased, "undashed" version for element names. Issue was reported here: http://groups.google.com/group/restsharp/browse_thread/thread/c70c39b47d10002d --- RestSharp/Deserializers/XmlDeserializer.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/RestSharp/Deserializers/XmlDeserializer.cs b/RestSharp/Deserializers/XmlDeserializer.cs index 1b42215af..42518592a 100644 --- a/RestSharp/Deserializers/XmlDeserializer.cs +++ b/RestSharp/Deserializers/XmlDeserializer.cs @@ -247,6 +247,13 @@ private object HandleListDerivative(object x, XElement root, string propName, Ty var elements = root.Descendants(t.Name.AsNamespaced(Namespace)); var name = t.Name; + + if (!elements.Any()) + { + var lowerName = name.ToLower().AsNamespaced(Namespace); + elements = root.Descendants().Where(e => e.Name.LocalName.RemoveUnderscoresAndDashes() == lowerName); + } + if (!elements.Any()) { var lowerName = name.ToLower().AsNamespaced(Namespace); From 322d37bb6fbd4fa7e85dda7576a8f536952045c7 Mon Sep 17 00:00:00 2001 From: Wiebe Tijsma Date: Thu, 17 May 2012 00:02:25 +0200 Subject: [PATCH 2/2] Added a fix and a unit test for the issue: https://github.com/restsharp/RestSharp/issues/269 The checkin consist of a new test: Can_Deserialize_Root_Elements_Without_Matching_Case_And_Dashes Which will deserialze a structure like this: ... To a List --- RestSharp.Tests/SampleClasses/misc.cs | 5 +++ RestSharp.Tests/XmlTests.cs | 36 +++++++++++++++++++--- RestSharp/Deserializers/XmlDeserializer.cs | 14 ++++----- 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/RestSharp.Tests/SampleClasses/misc.cs b/RestSharp.Tests/SampleClasses/misc.cs index 5058dc994..7de441c08 100644 --- a/RestSharp.Tests/SampleClasses/misc.cs +++ b/RestSharp.Tests/SampleClasses/misc.cs @@ -50,6 +50,11 @@ public class PersonForXml public Disposition Disposition { get; set; } } + + public class IncomingInvoice + { + public int ConceptId { get; set; } + } public class PersonForJson { diff --git a/RestSharp.Tests/XmlTests.cs b/RestSharp.Tests/XmlTests.cs index 9ad93104e..fb80d46a9 100644 --- a/RestSharp.Tests/XmlTests.cs +++ b/RestSharp.Tests/XmlTests.cs @@ -464,12 +464,12 @@ public void Can_Deserialize_Names_With_Dashes_On_Default_Root() Assert.NotNull(p.Foes); Assert.Equal(5, p.Foes.Count); Assert.Equal("Yankees", p.Foes.Team); - } - - [Fact] - public void Can_Deserialize_Names_With_Underscores_Without_Matching_Case_On_Default_Root() + } + + [Fact] + public void Can_Deserialize_Lower_Cased_Root_Elements_With_Dashes() { - var doc = CreateLowercaseUnderscoresXml(); + var doc = CreateDashesXml(); var response = new RestResponse { Content = doc }; var d = new XmlDeserializer(); @@ -497,6 +497,20 @@ public void Can_Deserialize_Names_With_Underscores_Without_Matching_Case_On_Defa Assert.Equal("Yankees", p.Foes.Team); } + [Fact] + public void Can_Deserialize_Root_Elements_Without_Matching_Case_And_Dashes() + { + var doc = CreateLowerCasedRootElementWithDashesXml(); + var response = new RestResponse { Content = doc }; + + var d = new XmlDeserializer(); + var p = d.Deserialize>(response); + + Assert.NotNull(p); + Assert.Equal(1, p.Count); + Assert.Equal(45, p[0].ConceptId); + } + [Fact] public void Can_Deserialize_Eventful_Xml() @@ -726,6 +740,18 @@ private static string CreateDashesXml() doc.Add(root); return doc.ToString(); } + + private static string CreateLowerCasedRootElementWithDashesXml() + { + var doc = new XDocument(); + var root = new XElement("incoming-invoices", + new XElement("incoming-invoice", + new XElement("concept-id", 45) + ) + ); + doc.Add(root); + return doc.ToString(); + } private static string CreateElementsXml() { diff --git a/RestSharp/Deserializers/XmlDeserializer.cs b/RestSharp/Deserializers/XmlDeserializer.cs index f79231c70..f579322a4 100644 --- a/RestSharp/Deserializers/XmlDeserializer.cs +++ b/RestSharp/Deserializers/XmlDeserializer.cs @@ -253,12 +253,6 @@ private object HandleListDerivative(object x, XElement root, string propName, Ty var name = t.Name; - if (!elements.Any()) - { - var lowerName = name.ToLower().AsNamespaced(Namespace); - elements = root.Descendants().Where(e => e.Name.LocalName.RemoveUnderscoresAndDashes() == lowerName); - } - if (!elements.Any()) { var lowerName = name.ToLower().AsNamespaced(Namespace); @@ -274,7 +268,13 @@ private object HandleListDerivative(object x, XElement root, string propName, Ty if (!elements.Any()) { elements = root.Descendants().Where(e => e.Name.LocalName.RemoveUnderscoresAndDashes() == name); - } + } + + if (!elements.Any()) + { + var lowerName = name.ToLower().AsNamespaced(Namespace); + elements = root.Descendants().Where(e => e.Name.LocalName.RemoveUnderscoresAndDashes() == lowerName); + } PopulateListFromElements(t, elements, list);