xml配置文件
前面演示在config文件中创建自定义配置节点的方法,那些方法也只适合在app.config或者web.config中,如果您的配置参数较多,或者打算将一些数据以配置文件的形式单独保存,那么,直接读写整个XML将会更方便。比如:我有一个实体类,我想将它保存在XML文件中,有可能是多条记录,也可能是一条。
这次我来反过来说,假如我们先定义了XML的结构,是下面这个样子的,那么我将怎么做呢?
<?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>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>insret into .....</CommandText>
</MyCommand>
</ArrayOfMyCommand>
对于上面的这段XML结构,我们可以在C#中先定义下面的类,然后通过序列化及反序列化的方式来实现对它的读写。
C#类的定义如下:
public class MyCommand
{
[XmlAttribute("Name")]
public string CommandName;
[XmlAttribute]
public string Database;
[XmlArrayItem("Parameter")]
public List<MyCommandParameter> Parameters = new List<MyCommandParameter>();
[XmlElement]
public string CommandText;
}
public class MyCommandParameter
{
[XmlAttribute("Name")]
public string ParamName;
[XmlAttribute("Type")]
public string ParamType;
}
{
[XmlAttribute("Name")]
public string CommandName;
[XmlAttribute]
public string Database;
[XmlArrayItem("Parameter")]
public List<MyCommandParameter> Parameters = new List<MyCommandParameter>();
[XmlElement]
public string CommandText;
}
public class MyCommandParameter
{
[XmlAttribute("Name")]
public string ParamName;
[XmlAttribute("Type")]
public string ParamType;
}
有了这二个C#类,读写这段XML就非常容易了。
以下就是相应的读写代码:
private void btnReadXml_Click(object sender, EventArgs e)
{
btnWriteXml_Click(null, null);
List<MyCommand> list = XmlHelper.XmlDeserializeFromFile<List<MyCommand>>(XmlFileName, Encoding.UTF8);
if( list.Count > 0 )
MessageBox.Show(list[0].CommandName + ": " + list[0].CommandText,
this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnWriteXml_Click(object sender, EventArgs e)
{
MyCommand command = new MyCommand();
command.CommandName = "InsretCustomer";
command.Database = "MyTestDb";
command.CommandText = "insret into .....";
command.Parameters.Add(new MyCommandParameter { ParamName = "Name", ParamType = "DbType.String" });
command.Parameters.Add(new MyCommandParameter { ParamName = "Address", ParamType = "DbType.String" });
List<MyCommand> list = new List<MyCommand>(1);
list.Add(command);
XmlHelper.XmlSerializeToFile(list, XmlFileName, Encoding.UTF8);
}
{
btnWriteXml_Click(null, null);
List<MyCommand> list = XmlHelper.XmlDeserializeFromFile<List<MyCommand>>(XmlFileName, Encoding.UTF8);
if( list.Count > 0 )
MessageBox.Show(list[0].CommandName + ": " + list[0].CommandText,
this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnWriteXml_Click(object sender, EventArgs e)
{
MyCommand command = new MyCommand();
command.CommandName = "InsretCustomer";
command.Database = "MyTestDb";
command.CommandText = "insret into .....";
command.Parameters.Add(new MyCommandParameter { ParamName = "Name", ParamType = "DbType.String" });
command.Parameters.Add(new MyCommandParameter { ParamName = "Address", ParamType = "DbType.String" });
List<MyCommand> list = new List<MyCommand>(1);
list.Add(command);
XmlHelper.XmlSerializeToFile(list, XmlFileName, Encoding.UTF8);
}
小结:
①读写整个XML最方便的方法是使用序列化反序列化。
② 如果您希望某个参数以Xml Property的形式出现,那么需要使用[XmlAttribute]修饰它。
③如果您希望某个参数以Xml Element的形式出现,那么需要使用[XmlElement]修饰它。
④如果您希望为某个List的项目指定ElementName,则需要[XmlArrayItem]
⑤ 以上3个Attribute都可以指定在XML中的映射别名。
⑥ 写XML的操作是通过XmlSerializer.Serialize()来实现的。
⑦ 读取XML文件是通过XmlSerializer.Deserialize来实现的。
⑧ List或Array项,请不要使用[XmlElement],否则它们将以内联的形式提升到当前类,除非你再定义一个容器类。