我已经看到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)
}
}
答案 0 :(得分:2)
将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
似乎需要这个。)