diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index a7a5f942..b6e3e3c3 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -2559,6 +2559,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 65b6e57c..a492c729 100644 --- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs @@ -101,7 +101,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) @@ -1032,11 +1032,11 @@ namespace Newtonsoft.Json.Converters if (!string.IsNullOrEmpty(prefix)) { - return prefix + ":" + node.LocalName; + return prefix + ":" + XmlConvert.DecodeName(node.LocalName); } else { - return node.LocalName; + return XmlConvert.DecodeName(node.LocalName); } }