是否可以有条件地序列化CDATA?

时间:2015-08-13 02:40:37

标签: c# xmlserializer

我已经看到solution让XmlSerializer输出CDATA部分,但是可以根据另一个值有条件地实现这个吗?

以下代码演示了我想要的结果:

enum LogItemType
{
   Default,
   Xml
}

class LogItem
{
   public string Name { get; set; }
   public LogItemType Type { get; set; }
   [XmlIgnore]
   public string Value { get; set; }
   public XmlCDataSection ValueString
   {
      if(Type == LogItemType.Xml)
         // return CDATA
      else
         // return string (not CDATA)
   }
}

1 个答案:

答案 0 :(得分:2)

ValueString属性的返回类型更改为XmlCharacterData,这是XmlTextXmlCDataSection的基类。然后根据Type属性的状态返回一个或另一个:

public class LogItem
{
    public string Name { get; set; }
    public LogItemType Type { get; set; }

    [XmlIgnore]
    public string Value { get; set; }

    [XmlElement("Value")]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public XmlCharacterData ValueString
    {
        get
        {
            if (Value == null)
                return null;
            else if (Type == LogItemType.Xml)
                // return CDATA
                return new XmlDocument().CreateCDataSection(Value);
            else
                // return string (not CDATA)
                return new XmlDocument().CreateTextNode(Value);
        }
        set
        {
            Value = value == null ? null : value.Value;
        }
    }
}

输出将是:

<LogItem>
    <Name>test</Name>
    <Type>Default</Type>
    <Value>this is a test string</Value>
</LogItem>

<LogItem>
    <Name>test</Name>
    <Type>Xml</Type>
    <Value><![CDATA[this is a test string]]></Value>
</LogItem>

或者,如果您希望Value文本为LogItem本身的值(而不是嵌套元素的值),则可以执行以下操作:

    [XmlText]
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    public XmlNode [] ValueString
    {
        get
        {
            if (Value == null)
                return null;
            else if (Type == LogItemType.Xml)
                // return CDATA
                return new XmlNode[] { new XmlDocument().CreateCDataSection(Value) };
            else
                // return string (not CDATA)
                return new XmlNode[] { new XmlDocument().CreateTextNode(Value) };
        }
        set
        {
            Value = value == null ? null : string.Concat(value.Select(n => n.Value).ToArray());
        }
    }

(请注意,返回的数组不是单个项目。XmlSerializer似乎需要这个。)