技术开发 频道

.NET中读写config文件的各种方法解析

  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);
    }
}

   我将使用这个类来控制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>

   xml文件读写注意事项

  通常,我们使用使用XmlSerializer.Serialize()得到的XML字符串的开头处,包含一段XML声明元素:

<?xml version="1.0" encoding="utf-8"?>

   由于各种原因,有时候可能不需要它。为了让这行字符消失,我见过有使用正则表达式去删除它的,也有直接分析字符串去删除它的。这些方法,要么浪费程序性能,要么就要多写些奇怪的代码。总之,就是看起来很别扭。其实,我们可以反过来想一下:能不能在序列化时,不输出它呢? 不输出它,不就达到我们期望的目的了吗?

0
相关文章