簡體   English   中英

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

[英]Is it possible to conditionally serialize CDATA?

我已經看到了讓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)
   }
}

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似乎需要這個。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM