diff --git a/.gitignore b/.gitignore index 74d3f2c8..ce83bf71 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ _ReSharper.* .vs/ *.lock.json *.nuget.props -*.nuget.targets \ No newline at end of file +*.nuget.targets +*.orig \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index b6e3e3c3..4c1c2c7b 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -592,6 +592,34 @@ namespace Newtonsoft.Json.Tests.Converters }", jsonText); } + [Test] + public void SerializeNodeTypes_Encoding() + { + XmlNode node = DeserializeXmlNode(@"{ + ""xs!:Choice!"": { + ""@msdata:IsDataSet!"": """", + ""@xmlns:xs!"": ""http://www.w3.org/2001/XMLSchema"", + ""@xmlns:msdata"": ""urn:schemas-microsoft-com:xml-msdata"", + ""?xml-stylesheet"": ""href=\""classic.xsl\"" type=\""text/xml\"""", + ""#cdata-section"": ""true"" + } +}"); + + Assert.AreEqual(@"true]]>", node.InnerXml); + + string json = SerializeXmlNode(node); + + StringAssert.AreEqual(@"{ + ""xs!:Choice!"": { + ""@msdata:IsDataSet!"": """", + ""@xmlns:xs!"": ""http://www.w3.org/2001/XMLSchema"", + ""@xmlns:msdata"": ""urn:schemas-microsoft-com:xml-msdata"", + ""?xml-stylesheet"": ""href=\""classic.xsl\"" type=\""text/xml\"""", + ""#cdata-section"": ""true"" + } +}", json); + } + [Test] public void DocumentFragmentSerialize() { @@ -1418,6 +1446,50 @@ namespace Newtonsoft.Json.Tests.Converters StringAssert.AreEqual(@"Alanhttp://www.google.comLouishttp://www.yahoo.com", doc.InnerXml); } + [Test] + public void EscapingNames() + { + string json = @"{ + ""root!"": { + ""person!"": [ + { + ""@id!"": ""1"", + ""name!"": ""Alan"", + ""url!"": ""http://www.google.com"" + }, + { + ""@id!"": ""2"", + ""name!"": ""Louis"", + ""url!"": ""http://www.yahoo.com"" + } + ] + } + }"; + + XmlDocument doc = (XmlDocument)DeserializeXmlNode(json); + + Assert.AreEqual(@"Alanhttp://www.google.comLouishttp://www.yahoo.com", doc.InnerXml); + + string json2 = SerializeXmlNode(doc); + + StringAssert.AreEqual(@"{ + ""root!"": { + ""person!"": [ + { + ""@id!"": ""1"", + ""name!"": ""Alan"", + ""url!"": ""http://www.google.com"" + }, + { + ""@id!"": ""2"", + ""name!"": ""Louis"", + ""url!"": ""http://www.yahoo.com"" + } + ] + } +}", json2); + } + [Test] public void SerializeDeserializeMetadataProperties() { diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs index a492c729..d482fe99 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(XmlConvert.EncodeName(elementName))); + return new XmlElementWrapper(_document.CreateElement(elementName)); } public IXmlElement CreateElement(string qualifiedName, string namespaceUri) @@ -1175,7 +1175,7 @@ namespace Newtonsoft.Json.Converters if (attribute.NamespaceUri == "http://www.w3.org/2000/xmlns/") { string namespacePrefix = (attribute.LocalName != "xmlns") - ? attribute.LocalName + ? XmlConvert.DecodeName(attribute.LocalName) : string.Empty; string namespaceUri = attribute.Value; @@ -1490,11 +1490,12 @@ namespace Newtonsoft.Json.Converters // add attributes to newly created element foreach (KeyValuePair nameValue in attributeNameValues) { + string encodedName = XmlConvert.EncodeName(nameValue.Key); string attributePrefix = MiscellaneousUtils.GetPrefix(nameValue.Key); IXmlNode attribute = (!string.IsNullOrEmpty(attributePrefix)) - ? document.CreateAttribute(nameValue.Key, manager.LookupNamespace(attributePrefix) ?? string.Empty, nameValue.Value) - : document.CreateAttribute(nameValue.Key, nameValue.Value); + ? document.CreateAttribute(encodedName, manager.LookupNamespace(attributePrefix) ?? string.Empty, nameValue.Value) + : document.CreateAttribute(encodedName, nameValue.Value); element.SetAttributeNode(attribute); } @@ -1531,11 +1532,12 @@ namespace Newtonsoft.Json.Converters private static void AddAttribute(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string attributeName, XmlNamespaceManager manager, string attributePrefix) { + string encodedName = XmlConvert.EncodeName(attributeName); string attributeValue = reader.Value.ToString(); IXmlNode attribute = (!string.IsNullOrEmpty(attributePrefix)) - ? document.CreateAttribute(attributeName, manager.LookupNamespace(attributePrefix), attributeValue) - : document.CreateAttribute(attributeName, attributeValue); + ? document.CreateAttribute(encodedName, manager.LookupNamespace(attributePrefix), attributeValue) + : document.CreateAttribute(encodedName, attributeValue); ((IXmlElement)currentNode).SetAttributeNode(attribute); } @@ -1822,9 +1824,10 @@ namespace Newtonsoft.Json.Converters private IXmlElement CreateElement(string elementName, IXmlDocument document, string elementPrefix, XmlNamespaceManager manager) { + string encodeName = XmlConvert.EncodeName(elementName); string ns = string.IsNullOrEmpty(elementPrefix) ? manager.DefaultNamespace : manager.LookupNamespace(elementPrefix); - IXmlElement element = (!string.IsNullOrEmpty(ns)) ? document.CreateElement(elementName, ns) : document.CreateElement(elementName); + IXmlElement element = (!string.IsNullOrEmpty(ns)) ? document.CreateElement(encodeName, ns) : document.CreateElement(encodeName); return element; }