[英]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
,它是XmlText
和XmlCDataSection
的基類。 然后根據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.