diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs
index 0c9b3dfb..e036629b 100644
--- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs
+++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs
@@ -2110,6 +2110,42 @@ namespace Newtonsoft.Json.Tests.Converters
Assert.AreEqual(@"", xmlString);
}
+ [Test]
+ public void IgnoreCultureForTypedAttributes()
+ {
+ var originalCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
+
+ try
+ {
+ System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("ru");
+
+ // in russian culture value 12.27 will be written as 12,27
+
+ var serializer = JsonSerializer.Create(new JsonSerializerSettings
+ {
+ Converters = { new XmlNodeConverter() },
+ });
+
+ var json = new StringBuilder(@"{
+ ""metrics"": {
+ ""type"": ""CPULOAD"",
+ ""@value"": 12.27
+ }
+ }");
+
+ using (var stringReader = new StringReader(json.ToString()))
+ using (var jsonReader = new JsonTextReader(stringReader))
+ {
+ var document = (XmlDocument)serializer.Deserialize(jsonReader, typeof(XmlDocument));
+ StringAssert.AreEqual(@"CPULOAD", document.OuterXml);
+ }
+ }
+ finally
+ {
+ System.Threading.Thread.CurrentThread.CurrentCulture = originalCulture;
+ }
+ }
+
private static void JsonBodyToSoapXml(Stream json, Stream xml)
{
Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings();
diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs
index d18b848a..82488052 100644
--- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs
+++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs
@@ -1831,7 +1831,25 @@ namespace Newtonsoft.Json.Converters
}
string encodedName = XmlConvert.EncodeName(attributeName);
- string attributeValue = reader.Value.ToString();
+ string attributeValue = "";
+
+ switch (reader.TokenType)
+ {
+ case JsonToken.String:
+ case JsonToken.Integer:
+ case JsonToken.Float:
+ case JsonToken.Boolean:
+ case JsonToken.Date:
+ attributeValue = ConvertTokenToXmlValue(reader);
+ break;
+ case JsonToken.Null:
+
+ // empty attribute. do nothing
+ break;
+ default:
+ attributeValue = reader.Value.ToString();
+ break;
+ }
IXmlNode attribute = (!string.IsNullOrEmpty(attributePrefix))
? document.CreateAttribute(encodedName, manager.LookupNamespace(attributePrefix), attributeValue)
@@ -1840,7 +1858,7 @@ namespace Newtonsoft.Json.Converters
((IXmlElement)currentNode).SetAttributeNode(attribute);
}
- private string ConvertTokenToXmlValue(JsonReader reader)
+ private static string ConvertTokenToXmlValue(JsonReader reader)
{
switch (reader.TokenType)
{