2016-06-28 6 views
0

Я пытаюсь преобразовать Xml в Json и запустить некоторую бизнес-логику, а затем Deserialize в объект C#, используя Newtonsoft Json.Net. Xml имеет значения CData. Как я могу десериализовать Json таким образом, чтобы получить значение внутри CData, сопоставленного с полем C#.Обработка CData при преобразовании Xml в Json с использованием Newtonsoft

EDIT: XML может /, могут не содержать CDATA

Е.Г. Xml:

С CDATA

<?xml version="1.0" encoding="UTF-8"?> <root> <text><![CDATA[Sample Text]]></text> </root>

С открытым текстом

<?xml version="1.0" encoding="UTF-8"?> <root> <text>Sample Text></text> </root>

Json:

С CDATA:

{"text":{"#cdata-section":"Sample Text"}}

С текстом:

{"text":"Sample Text"}

Код:

class Data 
{ 
     [JsonProperty("text")] 
     public string Text { get; set; } 
} 

public static Data ConvertJsonToObject(string json) 
{ 
    return JsonConvert.DeserializeObject<Data>(json); 
} 

Спасибо заранее.

ответ

0

xsd для вашего образца xml. Я определил CDATA как строку расширения простого типа и сложный тип для текстового узла, содержащего CDATA.

<xs:element name="root" type="CDATA_TEXT" /> 
<xs:simpleType name="CDATA"> 
    <xs:restriction base="xs:string"/> 
</xs:simpleType> 
<xs:complexType name="CDATA_TEXT"> 
    <xs:sequence> 
    <xs:element name="text" type="CDATA" /> 
    </xs:sequence> 
</xs:complexType> 

Сформирован CS файл из XSD:

namespace Q38072488.Xml 
{ 
    using System; 
    using System.Xml.Serialization; 

    [Serializable()] 
    [XmlRoot("root", Namespace = "", IsNullable = false)] 
    public partial class CDATA_TEXT 
    { 
    [XmlElement("text")] 
    public string Text { get; set; } 
    } 
} 

JSon классов:

namespace Q38072488.Json 
{ 
    using Newtonsoft.Json; 

    public class CDataText 
    { 
     [JsonProperty("#cdata-section")] 
     public string CDATA_Section { get; set; } 
    } 

    public class RootObject 
    { 
     [JsonProperty("text")] 
     public CDataText Text { get; set; } 
    } 
} 

десериализации из XML и конвертировать в формат JSON (можно добавить неявное преобразование):

using (var fs = File.OpenRead("cdata.xml")) { 
    var srlz = new XmlSerializer(typeof(Xml.CDATA_TEXT)); 
    var xmlCdataText = (Xml.CDATA_TEXT)srlz.Deserialize(fs); 
    var ro = new Json.RootObject() { 
    Text = new Json.CDataText() { 
     CDATA_Section = xmlCdataText.Text } }; 
    string json = JsonConvert.SerializeObject(ro); 
} 
+0

Спасибо за Андрея за ответ. Проблема здесь в том, что поле может содержать или не содержать CData. В одном xml поле может иметь CData, а в другом xml поле может иметь простой текст, решение должно работать для обоих случаев. (Прошу прощения, я пропустил упоминать эту информацию в вопросе) – Kaushik

Смежные вопросы