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");
注:代码中未作任何异常捕捉