C# 对XML的操作 及 C#的序列化

对于XML:SysProperty.xml

<?xml version="1.0" encoding="utf-8"?>
<SysProperty>
<SysContext>
<NekiProperty propertyName="databaseName" propertyValue="PMSDB" />
<NekiProperty propertyName="databaseIP" propertyValue="192.168.1.186" />
<NekiProperty propertyName="databasePort" propertyValue="3306" />
<NekiProperty propertyName="databaseUser" propertyValue="root" />
<NekiProperty propertyName="databasePassword" propertyValue="root" />
</SysContext>
</SysProperty>

 

主要介绍2种方式对此XML 进行读取修改操作,

第一种是通过XmlDocument来读取,第二种是序列化的读取。

 

一,XmlDocument方式:

 

1,读取 xml,并将NekiProperty 的 属性名及对应的值保存到Dictionary 里

private const string SYS_PROPERTY = "config\\SysProperty.xml";

string totalPath = Path.Combine(Application.StartupPath, SYS_PROPERTY);

XmlDocument doc = new XmlDocument();
doc.Load(totalPath);

XmlNode root = doc.SelectSingleNode("/SysProperty/SysContext");

XmlNodeList childrenList = root.ChildNodes;

dbMap = new Dictionary<string, string>();

foreach (XmlNode temp in childrenList)
{
dbMap.Add(temp.Attributes["propertyName"].Value, temp.Attributes["propertyValue"].Value);
}

 

这样就可以通过dbMap["databaseName"] 来获取其对应的值。


2,修改并保存xml里面的值。

foreach (XmlNode temp in childrenList)
{
if (temp.Attributes["propertyValue"].Value == "mysql")
{
XmlElement xe = temp as XmlElement;
xe.SetAttribute("propertyValue", "clothes");
break;
}
}
doc.Save(Path.Combine(Application.StartupPath, SYS_PROPERTY));

 

二,通过序列化进行操作:

首先需要创建3个类:SysProperty.cs;   SysContext.cs;   NekiProperty.cs   

 public class SysProperty
    {
        private SysContext sysContext; 

        public SysContext SysContext
        {
            get { return sysContext; }
            set { sysContext = value; }
        }

        public SysProperty LoadProperty(string file)
        {
            XmlSerializer xs = new XmlSerializer(typeof(SysProperty));
            StreamReader sr = new StreamReader(file);
            SysProperty sysProperty = xs.Deserialize(sr) as SysProperty;
            sr.Close();
            return sysProperty;
        }
        public void saveConfig(string file)
        {
            XmlSerializer xs = new XmlSerializer(typeof(SysProperty));
            StreamWriter sw = new StreamWriter(file);
            xs.Serialize(sw, this);
            sw.Close();
        }
        public string getPropertyValue(string propertyName)
        {
            foreach (NekiProperty property in sysContext)
            {
                if (property.PropertyName == propertyName)
                {
                    return property.PropertyValue;
                }
            }
            return string.Empty;
        }
    }
public class SysContext :List<NekiProperty>
    {

    }
public class NekiProperty
    {
        private string propertyName = "";
        private string propertyValue = "";

        [XmlAttribute("propertyName")]
        public string PropertyName
        {
            get { return propertyName; }
            set { propertyName = value; }
        }
        [XmlAttribute("propertyValue")]
        public string PropertyValue
        {
            get { return propertyValue; }
            set { propertyValue = value; }
        }
        public NekiProperty()
        {

        }
        public NekiProperty(string propertyName, string propertyValue)
        {
            this.propertyName = propertyName;
            this.propertyValue = propertyValue;
        } 
    }

然后就可以通过代码来读取其中的各个值

private const string SYS_PROPERTY = "config\\SysProperty.xml";
SysProperty sysProperty = new SysProperty().LoadProperty(Path.Combine(SYS_PROPERTY));
string ip = sysProperty.getPropertyValue("databaseIP");

 

注:代码中未作任何异常捕捉

 

posted on 2012-04-16 15:22  Rush_Sykes  阅读(492)  评论(0编辑  收藏  举报