【问题标题】:Handling CData in converting Xml to Json using Newtonsoft在使用 Newtonsoft 将 Xml 转换为 Json 时处理 CData
【发布时间】:2016-06-28 09:37:21
【问题描述】:

我正在尝试将 Xml 转换为 Json 并运行一些业务逻辑,然后使用 Newtonsoft Json.Net 反序列化为 c# 对象。 Xml 具有 CData 值。如何反序列化 Json,以便将 CData 中的值映射到 c# 字段。

编辑: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);
}

谢谢你。

【问题讨论】:

    标签: c# json.net cdata


    【解决方案1】:

    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>
    

    从 xsd 生成的 cs 文件:

    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);
    }
    

    【讨论】:

    • 感谢安德烈的回复。这里的问题是该字段可能包含也可能不包含 CData。在一个 xml 中,该字段可能具有 CData,而在另一个 xml 中,该字段可能具有纯文本,该解决方案应该适用于这两种情况。 (我很抱歉我错过了在问题中提及此信息)
    猜你喜欢
    • 2020-03-12
    • 2021-03-16
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2014-11-25
    相关资源
    最近更新 更多