2009-05-10 5 views
1

Ich habe die folgende Funktion:JSON.Net: Konvertieren JSON-String aus XML-Zeichenfolge Beispiel Ausgabe

public static T GetInstance<T>(string xmlString) 
{ 
    var xmlDoc = new XmlDocument(); 
    xmlDoc.Load(new StringReader(xmlString)); 
    string jsonString = JsonConvert.SerializeXmlNode(xmlDoc.DocumentElement); 
    T instance = JsonConvert.DeserializeObject(jsonString, typeof(T)) as T; 
    return instance; 
} 

Es funktioniert für normale XML-Strings in Ordnung. wenn die Eingabe-XML-Zeichenfolge enthält Kommentare jedoch, wie:

.... 
<!-- some comments ... 
--> 
.... 

Dann wird der Funktionsaufruf JsonConvert.DeserializeObject() eine Ausnahme aus:

Newtonsoft.Json.JsonSerializationException was unhandled 
Message="Unexpected token when deserializing object: Comment" 
Source="Newtonsoft.Json" 
StackTrace: 
    at Newtonsoft.Json.JsonSerializer.PopulateObject(Object newObject, JsonReader reader, Type objectType) 
    .... 

Entweder ich muss trimmen alle Kommentare in der XML-Zeichenkette, oder wenn ich irgendwelche Optionseinstellungen in JsonConvert verwenden kann, um Kommentare zu ignorieren.

Für die erste Option, wenn ich alle Kommentare mit XmlDocument nehmen muss, gibt es Optionen in XmlDocument verfügbar, um eine XML-Zeichenfolge in Nodes-only XML-Zeichenfolge zu konvertieren?

Für die zweite Option, bevorzuge ich, wenn es eine Option in Json.Net, Kommentare zu ignorieren, wenn desialize zum Objekt?

+0

Upps ich nicht Kommentare dachte. Ich werde Unterstützung für die Behandlung in der nächsten Version von Json.NET hinzufügen. –

Antwort

3

Ich denke, der beste Weg für mich ist jetzt, zuerst alle Kommentarknoten aus der XML-Zeichenkette zu entfernen.

public static string RemoveComments(
     string xmlString, 
     int indention) 
{ 
    XmlDocument xDoc = new XmlDocument(); 
    xDoc.PreserveWhitespace = false; 
    xDoc.LoadXml(xmlString); 
    XmlNodeList list = xDoc.SelectNodes("//comment()"); 

    foreach (XmlNode node in list) 
    { 
     node.ParentNode.RemoveChild(node); 
    } 

    string xml; 
    using (StringWriter sw = new StringWriter()) 
    { 
     using (XmlTextWriter xtw = new XmlTextWriter(sw)) 
     { 
     if (indention > 0) 
     { 
      xtw.IndentChar = ' '; 
      xtw.Indentation = indention; 
      xtw.Formatting = System.Xml.Formatting.Indented; 
     } 

     xDoc.WriteContentTo(xtw); 
     xtw.Close(); 
     sw.Close(); 
     } 
     xml = sw.ToString(); 
    } 

    return xml; 
    } 

Und das ist meine Funktion Instanz von XML-String zu erhalten:

public static T GetInstance<T>(string xmlString) 
{ 
    srring xml = RemoveComments(xmlString); 
    var xmlDoc = new XmlDocument(); 
    xmlDoc.Load(new StringReader(xml)); 
    string jsonString = JsonConvert.SerializeXmlNode(xmlDoc.DocumentElement); 
    T instance = JsonConvert.DeserializeObject(jsonString, typeof(T)) as T; 
    return instance; 
} 
Verwandte Themen