XElement.ToJson + Json.ToXElement don't round-trip
SteveGilham opened this issue · 1 comments
Although it looks like it was intended to, with the adding of the "-" sigil to distinguish attribute names in the resulting JSON, exporting XML as JSON text and then re-importing throws,
To Reproduce
Run this
using System;
using System.Xml.Linq;
using Manatee.Json;
namespace Example
{
internal class Program
{
private static void Main(string[] args)
{
var xmltext = "<Items><Item k=\"1\" v=\"a\" /><Item k=\"2\" v=\"b\" /></Items>";
var xml = XDocument.Parse(xmltext);
var jsontext = XmlExtensions.ToJson(xml.Root).ToString();
var json = JsonValue.Parse(jsontext);
var xmlout = json.ToXElement("dummy");
Console.WriteLine("{0}", xmlout);
}
}
}
Expected behavior
A default formatted version of the input xmltext
value printed out.
Actual behaviour
Raises
System.Xml.XmlException
HResult=0x80131940
Message=Name cannot begin with the '-' character, hexadecimal value 0x2D.
Source=System.Private.Xml
StackTrace:
at System.Xml.XmlConvert.VerifyNCName(String name, ExceptionType exceptionType) in /_/src/System.Private.Xml/src/System/Xml/XmlConvert.cs:line 417
at System.Xml.XmlConvert.VerifyNCName(String name) in /_/src/System.Private.Xml/src/System/Xml/XmlConvert.cs:line 406
at System.Xml.Linq.XName..ctor(XNamespace ns, String localName) in /_/src/System.Private.Xml.Linq/src/System/Xml/Linq/XName.cs:line 26
at System.Xml.Linq.XNamespace.GetName(String localName, Int32 index, Int32 count) in /_/src/System.Private.Xml.Linq/src/System/Xml/Linq/XNamespace.cs:line 223
at System.Xml.Linq.XNamespace.GetName(String localName) in /_/src/System.Private.Xml.Linq/src/System/Xml/Linq/XNamespace.cs:line 59
at System.Xml.Linq.XName.Get(String expandedName) in /_/src/System.Private.Xml.Linq/src/System/Xml/Linq/XName.cs:line 85
at System.Xml.Linq.XName.op_Implicit(String expandedName) in /_/src/System.Private.Xml.Linq/src/System/Xml/Linq/XName.cs:line 108
at Manatee.Json.XmlExtensions._GetXName(String key)
at Manatee.Json.XmlExtensions.ToXElement(JsonValue json, String key)
at Manatee.Json.XmlExtensions.ToXElement(JsonValue json, String key)
at Manatee.Json.XmlExtensions.ToXElement(JsonValue json, String key)
at Manatee.Json.XmlExtensions.ToXElement(JsonValue json, String key)
at Manatee.Json.XmlExtensions.ToXElement(JsonValue json, String key)
at Example.Program.Main(String[] args) in C:\Users\steve\source\repos\ClassLibrary1\ConsoleApp6\Program.cs:line 19
Desktop (please complete the following information):
- OS: Win10 Home
- .Net Target: netcoreapp3.1
- Version: 13.0.4
@SteveGilham thanks for the report. I'm surprised that someone is using this functionality. I included it at a whim when I first created this library quite a long time ago.
That said, I've stopped maintaining this library. If you'd like to explore the issue, I'm happy to accept PRs. Alternatively, you're welcome to take the code and use it at your own discretion.