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 f3f5fa9ae..f579322a4 100644 --- a/RestSharp/Deserializers/XmlDeserializer.cs +++ b/RestSharp/Deserializers/XmlDeserializer.cs @@ -252,6 +252,7 @@ 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); @@ -267,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);