diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index 1ceda7a1..579807d7 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -2554,6 +2554,19 @@ namespace Newtonsoft.Json.Tests.Converters Assert.AreEqual(@"{""DocumentId"":""13779965364495889899""}", json2); } #endif + [Test] + public void DeserializeXmlIncompatibleCharsInPropertyName() + { + var json = "{\"%name\":\"value\"}"; + + XmlDocument node = JsonConvert.DeserializeXmlNode(json); + + Assert.AreEqual("<_x0025_name>value", node.OuterXml); + + string json2 = JsonConvert.SerializeXmlNode(node); + + Assert.AreEqual(json, json2); + } [Test] public void SerializeEmptyNodeAndOmitRoot() diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs index 709f4432..157f5d13 100644 --- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs @@ -99,7 +99,7 @@ namespace Newtonsoft.Json.Converters public IXmlElement CreateElement(string elementName) { - return new XmlElementWrapper(_document.CreateElement(elementName)); + return new XmlElementWrapper(_document.CreateElement(XmlConvert.EncodeName(elementName))); } public IXmlElement CreateElement(string qualifiedName, string namespaceUri) @@ -977,9 +977,9 @@ namespace Newtonsoft.Json.Converters : manager.LookupPrefix(node.NamespaceUri); if (!string.IsNullOrEmpty(prefix)) - return prefix + ":" + node.LocalName; + return prefix + ":" + XmlConvert.DecodeName(node.LocalName); else - return node.LocalName; + return XmlConvert.DecodeName(node.LocalName); } private string GetPropertyName(IXmlNode node, XmlNamespaceManager manager)