diff --git a/RestSharp.Tests/RestSharp.Tests.csproj b/RestSharp.Tests/RestSharp.Tests.csproj index 48c027dcd..66b8c8b1a 100644 --- a/RestSharp.Tests/RestSharp.Tests.csproj +++ b/RestSharp.Tests/RestSharp.Tests.csproj @@ -84,6 +84,7 @@ + @@ -122,6 +123,9 @@ Always + + Always + Always diff --git a/RestSharp.Tests/SampleClasses/Goodreads.cs b/RestSharp.Tests/SampleClasses/Goodreads.cs new file mode 100644 index 000000000..796a4ad6c --- /dev/null +++ b/RestSharp.Tests/SampleClasses/Goodreads.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace RestSharp.Tests.SampleClasses +{ + public class GoodReadsReviewCollection + { + public int Start { get; set; } + public int End { get; set; } + public int Total { get; set; } + public List Reviews { get; set; } + } + + public class GoodReadsReview + { + public string Id { get; set; } + public GoodReadsBook Book { get; set; } + } + + public class GoodReadsBook + { + public string Isbn { get; set; } + } +} diff --git a/RestSharp.Tests/SampleData/Goodreads.xml b/RestSharp.Tests/SampleData/Goodreads.xml new file mode 100644 index 000000000..f6d82bafc --- /dev/null +++ b/RestSharp.Tests/SampleData/Goodreads.xml @@ -0,0 +1,17 @@ + + + + + + 0345475836 + + + + + 1198344567 + + 0802775802 + + + + \ No newline at end of file diff --git a/RestSharp.Tests/XmlDeserializerTests.cs b/RestSharp.Tests/XmlDeserializerTests.cs index 63dfe0a8b..cf29b09ce 100644 --- a/RestSharp.Tests/XmlDeserializerTests.cs +++ b/RestSharp.Tests/XmlDeserializerTests.cs @@ -546,6 +546,20 @@ public void Can_Deserialize_Google_Weather_Xml() Assert.Equal("Sunny", output.weather[0].condition.data); } + [Fact] + public void Can_Deserialize_Goodreads_Xml() + { + var xmlpath = PathFor("Goodreads.xml"); + var doc = XDocument.Load(xmlpath); + var response = new RestResponse { Content = doc.ToString() }; + var d = new XmlDeserializer(); + var output = d.Deserialize(response); + + Assert.Equal(2, output.Reviews.Count); + Assert.Equal("1208943892", output.Reviews[0].Id); // This fails without fixing the XmlDeserializer + Assert.Equal("1198344567", output.Reviews[1].Id); + } + [Fact] public void Can_Deserialize_Boolean_From_Number() { diff --git a/RestSharp/Deserializers/XmlDeserializer.cs b/RestSharp/Deserializers/XmlDeserializer.cs index 886b3096d..7c2c532c7 100644 --- a/RestSharp/Deserializers/XmlDeserializer.cs +++ b/RestSharp/Deserializers/XmlDeserializer.cs @@ -453,50 +453,27 @@ protected virtual XElement GetElementByName(XElement root, XName name) } // try looking for element that matches sanitized property name (Order by depth) - var element = - root.Descendants() - .OrderBy(d => d.Ancestors().Count()) - .FirstOrDefault(d => d.Name.LocalName.RemoveUnderscoresAndDashes() == name.LocalName) ?? root.Descendants() - .OrderBy(d => d.Ancestors().Count()) - .FirstOrDefault(d => d.Name.LocalName.RemoveUnderscoresAndDashes() == name.LocalName.ToLower()); - - if (element != null) - { - return element; - } - - return null; + return root.Descendants() + .OrderBy(d => d.Ancestors().Count()) + .FirstOrDefault(d => d.Name.LocalName.RemoveUnderscoresAndDashes() == name.LocalName) ?? + root.Descendants() + .OrderBy(d => d.Ancestors().Count()) + .FirstOrDefault(d => d.Name.LocalName.RemoveUnderscoresAndDashes() == name.LocalName.ToLower()); } protected virtual XAttribute GetAttributeByName(XElement root, XName name) { - var lowerName = name.LocalName.ToLower().AsNamespaced(name.NamespaceName); - var camelName = name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName); - - if (root.Attribute(name) != null) - { - return root.Attribute(name); - } - - if (root.Attribute(lowerName) != null) + var names = new List { - return root.Attribute(lowerName); - } - - if (root.Attribute(camelName) != null) - { - return root.Attribute(camelName); - } - - // try looking for element that matches sanitized property name - var element = root.Attributes().FirstOrDefault(d => d.Name.LocalName.RemoveUnderscoresAndDashes() == name.LocalName); - - if (element != null) - { - return element; - } - - return null; + name.LocalName, + name.LocalName.ToLower().AsNamespaced(name.NamespaceName), + name.LocalName.ToCamelCase(Culture).AsNamespaced(name.NamespaceName) + }; + + return root.DescendantsAndSelf() + .OrderBy(d => d.Ancestors().Count()) + .Attributes() + .FirstOrDefault(d => names.Contains(d.Name.LocalName.RemoveUnderscoresAndDashes())); } } }