Skip to content

Commit a60a8b4

Browse files
Merge pull request restsharp#903 from mattasaro/master
Fix attribute being deserialized as parent element when named Value
2 parents 0048dda + 1cddbfb commit a60a8b4

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed

RestSharp.Tests/SampleClasses/misc.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,18 @@ public class Band
7979
}
8080
}
8181

82+
public class ValueCollectionForXml
83+
{
84+
public string Value { get; set; }
85+
public List<ValueForXml> Values { get; set; }
86+
}
87+
88+
public class ValueForXml
89+
{
90+
public DateTime Timestamp { get; set; }
91+
public string Value { get; set; }
92+
}
93+
8294
public class IncomingInvoice
8395
{
8496
public int ConceptId { get; set; }

RestSharp.Tests/XmlDeserializerTests.cs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,67 @@ public void Can_Deserialize_DateTimeOffset()
659659
Assert.AreEqual(nullableDateTimeOffsetWithValue, payload.NullableDateTimeOffsetWithValue);
660660
}
661661

662+
[Test]
663+
public void Can_Deserialize_ElementNamedValue()
664+
{
665+
XDocument doc = new XDocument();
666+
XElement root = new XElement("ValueCollection");
667+
668+
string valueName = "First moon landing events";
669+
root.Add(new XElement("Value", valueName));
670+
671+
var xmlCollection = new XElement("Values");
672+
673+
var first = new XElement("Value");
674+
first.Add(new XAttribute("Timestamp", new DateTime(1969, 7, 20, 20, 18, 00, DateTimeKind.Utc)));
675+
xmlCollection.Add(first);
676+
677+
var second = new XElement("Value");
678+
second.Add(new XAttribute("Timestamp", new DateTime(1969, 7, 21, 2, 56, 15, DateTimeKind.Utc)));
679+
xmlCollection.Add(second);
680+
681+
root.Add(xmlCollection);
682+
doc.Add(root);
683+
684+
RestResponse response = new RestResponse { Content = doc.ToString() };
685+
XmlDeserializer d = new XmlDeserializer();
686+
ValueCollectionForXml valueCollection = d.Deserialize<ValueCollectionForXml>(response);
687+
688+
Assert.AreEqual(valueName, valueCollection.Value);
689+
Assert.AreEqual(2, valueCollection.Values.Count);
690+
Assert.AreEqual(new DateTime(1969, 7, 20, 20, 18, 00, DateTimeKind.Utc), valueCollection.Values.First().Timestamp.ToUniversalTime());
691+
}
692+
693+
[Test]
694+
public void Can_Deserialize_AttributeNamedValue()
695+
{
696+
XDocument doc = new XDocument();
697+
XElement root = new XElement("ValueCollection");
698+
699+
var xmlCollection = new XElement("Values");
700+
701+
var first = new XElement("Value");
702+
first.Add(new XAttribute("Timestamp", new DateTime(1969, 7, 20, 20, 18, 00, DateTimeKind.Utc)));
703+
first.Add(new XAttribute("Value", "Eagle landed"));
704+
705+
xmlCollection.Add(first);
706+
707+
var second = new XElement("Value");
708+
second.Add(new XAttribute("Timestamp", new DateTime(1969, 7, 21, 2, 56, 15, DateTimeKind.Utc)));
709+
second.Add(new XAttribute("Value", "First step"));
710+
xmlCollection.Add(second);
711+
712+
root.Add(xmlCollection);
713+
doc.Add(root);
714+
715+
RestResponse response = new RestResponse { Content = doc.ToString() };
716+
XmlDeserializer d = new XmlDeserializer();
717+
ValueCollectionForXml valueCollection = d.Deserialize<ValueCollectionForXml>(response);
718+
719+
Assert.AreEqual(2, valueCollection.Values.Count);
720+
Assert.AreEqual("Eagle landed", valueCollection.Values.First().Value);
721+
}
722+
662723
private static string CreateUnderscoresXml()
663724
{
664725
XDocument doc = new XDocument();

RestSharp/Deserializers/XmlDeserializer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,8 @@ protected virtual XElement GetElementByName(XElement root, XName name)
522522
return root.Element(camelName);
523523
}
524524

525-
if (name == "Value".AsNamespaced(name.NamespaceName))
525+
if (name == "Value".AsNamespaced(name.NamespaceName) &&
526+
(!root.HasAttributes || root.Attributes().All(x => x.Name != name)))
526527
{
527528
return root;
528529
}

0 commit comments

Comments
 (0)