xml配置文件 - CDATA
在前面的演示中,有个不完美的地方,我将SQL脚本以普通字符串的形式输出到XML中了:
<CommandText>insret into .....</CommandText>
显然,现实中的SQL脚本都是比较长的,而且还可能会包含一些特殊的字符,这种做法是不可取的,好的处理方式应该是将它以CDATA的形式保存,为了实现这个目标,我们就不能直接按照普通字符串的方式来处理了,这里我定义了一个类 MyCDATA:
public class MyCDATA : IXmlSerializable
{
private string _value;
public MyCDATA() { }
public MyCDATA(string value)
{
this._value = value;
}
public string Value
{
get { return _value; }
}
XmlSchema IXmlSerializable.GetSchema()
{
return null;
}
void IXmlSerializable.ReadXml(XmlReader reader)
{
this._value = reader.ReadElementContentAsString();
}
void IXmlSerializable.WriteXml(XmlWriter writer)
{
writer.WriteCData(this._value);
}
public override string ToString()
{
return this._value;
}
public static implicit operator MyCDATA(string text)
{
return new MyCDATA(text);
}
}
{
private string _value;
public MyCDATA() { }
public MyCDATA(string value)
{
this._value = value;
}
public string Value
{
get { return _value; }
}
XmlSchema IXmlSerializable.GetSchema()
{
return null;
}
void IXmlSerializable.ReadXml(XmlReader reader)
{
this._value = reader.ReadElementContentAsString();
}
void IXmlSerializable.WriteXml(XmlWriter writer)
{
writer.WriteCData(this._value);
}
public override string ToString()
{
return this._value;
}
public static implicit operator MyCDATA(string text)
{
return new MyCDATA(text);
}
}
我将使用这个类来控制CommandText在XML序列化及反序列化的行为,让它写成一个CDATA形式,因此,我还需要修改CommandText的定义,改成这个样子:
public MyCDATA CommandText;
最终,得到的结果是:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMyCommand xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MyCommand Name="InsretCustomer" Database="MyTestDb">
<Parameters>
<Parameter Name="Name" Type="DbType.String" />
<Parameter Name="Address" Type="DbType.String" />
</Parameters>
<CommandText><![CDATA[insret into .....]]></CommandText>
</MyCommand>
</ArrayOfMyCommand>
<ArrayOfMyCommand xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MyCommand Name="InsretCustomer" Database="MyTestDb">
<Parameters>
<Parameter Name="Name" Type="DbType.String" />
<Parameter Name="Address" Type="DbType.String" />
</Parameters>
<CommandText><![CDATA[insret into .....]]></CommandText>
</MyCommand>
</ArrayOfMyCommand>
xml文件读写注意事项
通常,我们使用使用XmlSerializer.Serialize()得到的XML字符串的开头处,包含一段XML声明元素:
<?xml version="1.0" encoding="utf-8"?>
由于各种原因,有时候可能不需要它。为了让这行字符消失,我见过有使用正则表达式去删除它的,也有直接分析字符串去删除它的。这些方法,要么浪费程序性能,要么就要多写些奇怪的代码。总之,就是看起来很别扭。其实,我们可以反过来想一下:能不能在序列化时,不输出它呢? 不输出它,不就达到我们期望的目的了吗?