目录
- C#写入xml文件
- 1、XmlDocument
- 2、DataSet对象里的值来生成XML文件
- 3、利用XmlSerializer来将类的属性值转换为XML文件的元素值。
- 示例:写入xml
- 1、创建xml文档
- 2 、增加节点
- 3 、修改节点:
- 4 、删除节点
- c#读取xml文件
- 总结
C#写入xml文件
1、XmlDocument
1。我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用XmlDocument保存文件。
首先加载要写入的XML文件,但是如果没有的,就要新建,在新建的过程中,要有写入的代码;
XmlDocument doc = new XmlDocument(); | |
try | |
{ | |
doc.Load("new.xml"); | |
} | |
catch | |
{ | |
XmlTextWriter xtw = new XmlTextWriter("new.xml", Encoding.UTF8); | |
//新建XML文件 | |
xtw.WriteStartDocument(); | |
xtw.WriteStartElement("gnode"); | |
// gnode根节点 | |
xtw.WriteStartElement("myxm1"); | |
// gnode根节点下的元素myxmls | |
xtw.WriteEndElement(); | |
xtw.WriteEndElement(); | |
xtw.WriteEndDocument(); | |
xtw.Close(); | |
doc.Load("new.xml"); | |
} | |
XmlNode xn = doc.DocumentElement; | |
//找到根节点 | |
XmlElement xe = doc.CreateElement("myxml2"); | |
//在根节点下创建元素,如果是属性,则用XmlAttribute; | |
xe.InnerText = "薪薪代码hahaha"; | |
//给子节点写入文本节点(值) | |
xn.AppendChild(xe); | |
//根节点将其纳入 | |
doc.Save("new2.xml"); | |
//利用XmlDocument保存文件 | |
} |
注意点:在新建根节点的时候,WriteStartElement,只能嵌套,也就是只能有一个根节点。
2、DataSet对象里的值来生成XML文件
应用到数据库,将数据库的DataSet对象里的值来生成XML文件的元素;
using (SqlConnection con = new SqlConnection("Server=.;DataBase=HGSTUDY;uid=sa;pwd=yao")) | |
{ | |
con.Open(); | |
SqlCommand command = new SqlCommand("select * from GL_STUDY", con); | |
command.CommandType = CommandType.Text; | |
DataSet ds = new DataSet("DATASET"); | |
//DATASET将成为XML文件中的根节点名称,否则系统将其命名为NewDataSet | |
SqlDataAdapter sda = new SqlDataAdapter(); | |
sda.SelectCommand = command; | |
sda.Fill(ds, "DATATABLE"); | |
//DATATABLE为所生成XML文件中的子节点名称,否则系统将其命名为Table。 | |
ds.WriteXml("dbxml.xml"); | |
// DataSet的方法WriteXml将数据写入到XML文件,就是这么一句话。如果不保存到文件,直接ds.GetXML() | |
} |
3、利用XmlSerializer来将类的属性值转换为XML文件的元素值。
用一个字符串作为一个XML文档中的xmlAttribute或xmlElement。[其元素或属性由类的定义来设置(xml串行化)]
using System;System.xml.Serialization;
先初始化一个类,设置属性值
var xmlDoc = new XmlDocument(); | |
//Create the xml declaration first | |
xmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null)); | |
//Create the root node and append into doc | |
var el = xmlDoc.CreateElement("Contacts"); | |
xmlDoc.AppendChild(el); | |
// Contact | |
XmlElement elementContact = xmlDoc.CreateElement("Contact"); | |
XmlAttribute attrID = xmlDoc.CreateAttribute("id"); | |
attrID.Value = "01"; | |
elementContact.Attributes.Append(attrID); | |
el.AppendChild(elementContact); | |
// Contact Name | |
XmlElement elementName = xmlDoc.CreateElement("Name"); | |
elementName.InnerText = "Daisy Abbey"; | |
elementContact.AppendChild(elementName); | |
// Contact Gender | |
XmlElement elementGender = xmlDoc.CreateElement("Gender"); | |
elementGender.InnerText = "female"; | |
elementContact.AppendChild(elementGender); | |
xmlDoc.Save("test1.xml"); |
建XmlSerializer实例
class XXX { | |
XmlSerializer ser = new XmlSerializer(Type.GetType("forxml.truck")); | |
Truck tr = new Truck(); | |
tr.ID = 1; | |
tr.cheID = "赣A T34923"; | |
} |
Serialize方法–完成对类的串行化
XmlTextWriter xtw = new XmlTextWriter("myxml.xml",Encoding.UTF8); | |
用XmlTextWriter 创建一个XML文件 | |
ser.Serialize(xtw, tr); | |
//如果只想显示,可以直接ser.Serialize(Console.Out, tr); | |
} |
xml常用方法:
定义xml文档:XmlDocument xmlDoc = new XmlDocument();
初始化xml文档:xmlDoc.Load(“D:\book.xml”);//找到xml文件
创建根元素:XmlElement xmlElement = xmlDoc.CreateElement(“”, “Employees”, “”);
创建节点:XmlElement xeSub1 = xmlDoc.CreateElement(“title”);
查找Employees节点:XmlNode root = xmlDoc.SelectSingleNode(“Employees”);
添加节点:xe1.AppendChild(xeSub1);
更改节点的属性:xe.SetAttribute(“Name”, “李明明”);
移除xe的ID属性:xe.RemoveAttribute(“ID”);
删除节点title:xe.RemoveChild(xe2);
示例:写入xml
1、创建xml文档
public void CreateXMLDocument() | |
{ | |
XmlDocument xmlDoc = new XmlDocument(); | |
//加入XML的声明段落,<?xml version="1.0" encoding="gb2312"?> | |
XmlDeclaration xmlDeclar; | |
xmlDeclar = xmlDoc.CreateXmlDeclaration("1.0", "gb2312", null); | |
xmlDoc.AppendChild(xmlDeclar); | |
//加入Employees根元素 | |
XmlElement xmlElement = xmlDoc.CreateElement("", "Employees", ""); | |
xmlDoc.AppendChild(xmlElement); | |
//添加节点 | |
XmlNode root = xmlDoc.SelectSingleNode("Employees"); | |
XmlElement xe1 = xmlDoc.CreateElement("Node"); | |
xe1.SetAttribute("Name", "薪薪代码"); | |
xe1.SetAttribute("ISB", "2-3631-4"); | |
//添加子节点 | |
XmlElement xeSub1 = xmlDoc.CreateElement("title"); | |
xeSub1.InnerText = "学习VS"; | |
xe1.AppendChild(xeSub1); | |
XmlElement xeSub2 = xmlDoc.CreateElement("price"); | |
xe1.AppendChild(xeSub2); | |
XmlElement xeSub3 = xmlDoc.CreateElement("weight"); | |
xeSub3.InnerText = "20"; | |
xeSub2.AppendChild(xeSub3); | |
root.AppendChild(xe1); | |
xmlDoc.Save("D:\\book.xml");//保存的路径 | |
} |
生成的xml文件如下:
-<Employees>- | |
<Node ISB="2-3631-4" Name="薪薪代码"> | |
<title>学习VS</title>- | |
<price> | |
<weight>20</weight> | |
</price> | |
</Node> | |
</Employees> |
2 、增加节点
XmlDocument xmlDoc = new XmlDocument(); | |
xmlDoc.Load("D:\\book.xml");//找到xml文件 | |
XmlNode root = xmlDoc.SelectSingleNode("Employees");//查找Employees节点 | |
XmlElement xe1 = xmlDoc.CreateElement("Node2");//添加Node2节点 | |
xe1.SetAttribute("Name", "张飞"); | |
XmlElement xeSub1 = xmlDoc.CreateElement("title");//定义子节点 | |
xeSub1.InnerText = "心情好"; | |
xe1.AppendChild(xeSub1);//添加节点到Node2 | |
root.AppendChild(xe1);//添加节点到Employees | |
xmlDoc.Save("D:\\book.xml"); |
结果:
-<Employees> | |
-<Node ISB="2-3631-4" Name="薪薪代码"> | |
<title>学习VS</title>- | |
<price> | |
<weight>20</weight> | |
</price> | |
</Node>- | |
<Node2 Name="张三"> | |
<title>心情好</title> | |
</Node2>- | |
<Node2 Name="张三"> | |
<title>心情好</title> | |
</Node2> | |
</Employees> |
3 、修改节点:
public void ModifyNode() | |
{ | |
XmlDocument xmlDocument = new XmlDocument(); | |
xmlDocument.Load("D:\\book.xml"); | |
XmlNodeList nodeList = xmlDocument.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点 | |
foreach (XmlNode xn in nodeList)//遍历 | |
{ | |
XmlElement xe = (XmlElement)xn; | |
if (xe.GetAttribute("Name") == "薪薪代码") | |
{ | |
xe.SetAttribute("Name", "薪薪");//更改节点的属性 | |
XmlNodeList xnl = xe.ChildNodes;//获取xe的所有子节点 | |
foreach (XmlNode xn1 in xnl) | |
{ | |
XmlElement xe2 = (XmlElement)xn1;//将节点xn1的属性转换为XmlElement | |
if (xe2.Name == "title")//找到节点名字为title的节点 | |
{ | |
xe2.InnerText = "今天天气不好"; | |
} | |
if (xe2.Name == "price") | |
{ | |
XmlNodeList xnl2 = xe2.ChildNodes; | |
foreach (XmlNode xn2 in xnl2) | |
{ | |
if (xn2.Name == "weight") | |
{ | |
xn2.InnerText = "88"; | |
} | |
} | |
} | |
} | |
} | |
} | |
xmlDocument.Save("D:\\book2.xml"); | |
} |
运行结果:
-<Employees> | |
-<Node ISB="2-3631-4" Name="薪薪"> | |
<title>今天天气不好</title>-<price> | |
<weight>88</weight> | |
</price> | |
</Node> | |
-<Node2 Name="张三"> | |
<title>心情好</title> | |
</Node2></Employees> |
4 、删除节点
public void DeleteNode() | |
{ | |
XmlDocument xmlDocument = new XmlDocument(); | |
xmlDocument.Load("D:\\book1.xml"); | |
XmlNodeList xnl = xmlDocument.SelectSingleNode("Employees").ChildNodes; | |
foreach (XmlNode xn in xnl) | |
{ | |
if (xn.Name == "Node") | |
{ | |
XmlElement xe = (XmlElement)xn;//将xn的属性转换为XmlElement | |
xe.RemoveAttribute("ID");//移除xe的ID属性 | |
XmlNodeList xnl2 = xe.ChildNodes; | |
for (int i = 0; i < xnl2.Count; i++) | |
{ | |
XmlElement xe2 = (XmlElement)xnl2.Item(i); | |
if (xe2.Name == "title") | |
{ | |
xe.RemoveChild(xe2);//删除节点title | |
} | |
} | |
} | |
} | |
xmlDocument.Save("D:\\book3.xml"); | |
} |
结果:
-<Employees> | |
-<Node ISB="2-3631-4" Name="薪薪">-<price> | |
<weight>20</weight> | |
</price> | |
</Node>- | |
<Node2 Name="张三"> | |
<title>心情好</title> | |
</Node2>- | |
<Node2 Name="张三"> | |
<title>心情好</title> | |
</Node2> | |
</Employees> |
c#读取xml文件
xml文件如下:
<configurationN> | |
<ServerAddress>1143</ServerAddress> | |
<ID>192.168</ID> | |
</configurationN> |
在写入xml文件时,最主要使用了两个方法:Load和Save。
Load:初始化xml文档,以便项目文件获取具体的xml节点的值。
public void Load(string path) | |
{ | |
try | |
{ | |
XmlDocument xmlDocument = new XmlDocument(); | |
xmlDocument.Load(path); | |
XmlNodeList xnl = xmlDocument.SelectSingleNode(managerNode).ChildNodes; | |
foreach (XmlNode xn in xnl) | |
{ | |
if (xn.Name == configuration_ServerAddress) | |
{ | |
ServerAddress = xn.InnerText; | |
} | |
} | |
} | |
catch(Exception ex) | |
{ } | |
} |
Save:在项目系统中进行修改配置文件值后,需要对xml进行重新保存
public void Save(string path) | |
{ | |
try | |
{ | |
XmlDocument xmlDocument = new XmlDocument(); | |
xmlDocument.Load(path); | |
XmlNodeList xnl = xmlDocument.SelectSingleNode(managerNode).ChildNodes; | |
foreach (XmlNode xn in xnl) | |
{ | |
if (xn.Name == configuration_ServerAddress) | |
{ | |
xn.InnerText = ServerAddress; | |
} | |
} | |
xmlDocument.Save(path); | |
} | |
catch (Exception ex) | |
{ } | |
} |
此处将所有代码都贴出来,方便下次实现。因为项目是WPF文件,而且都是简单控件,所以只贴出后台代码。
class ConfigurationManager:INotifyPropertyChanged | |
{ | |
public const string managerNode = "configurationN";//根节点 | |
public const string configuration_ServerAddress = "ServerAddress";//子节点 | |
private string _ServerAddress; | |
public string ServerAddress | |
{ | |
get { return _ServerAddress; } | |
set | |
{ | |
_ServerAddress = value; | |
NotifyPropertyChanged("ServerAddress"); | |
} | |
} | |
public void Load(string path) | |
{ | |
try | |
{ | |
XmlDocument xmlDocument = new XmlDocument(); | |
xmlDocument.Load(path); | |
XmlNodeList xnl = xmlDocument.SelectSingleNode(managerNode).ChildNodes; | |
foreach (XmlNode xn in xnl) | |
{ | |
if (xn.Name == configuration_ServerAddress) | |
{ | |
ServerAddress = xn.InnerText; | |
} | |
} | |
} | |
catch(Exception ex) | |
{ } | |
} | |
public void Save(string path) | |
{ | |
try | |
{ | |
XmlDocument xmlDocument = new XmlDocument(); | |
xmlDocument.Load(path); | |
XmlNodeList xnl = xmlDocument.SelectSingleNode(managerNode).ChildNodes; | |
foreach (XmlNode xn in xnl) | |
{ | |
if (xn.Name == configuration_ServerAddress) | |
{ | |
xn.InnerText = ServerAddress; | |
} | |
} | |
xmlDocument.Save(path); | |
} | |
catch (Exception ex) | |
{ } | |
} | |
public event PropertyChangedEventHandler PropertyChanged; | |
private void NotifyPropertyChanged(string propertyName) | |
{ | |
if (PropertyChanged != null) | |
{ | |
PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); | |
} | |
} | |
public static ConfigurationManager Instance = new ConfigurationManager(); | |
} | |
public partial class MainWindow : Window | |
{ | |
public MainWindow() | |
{ | |
InitializeComponent(); | |
Start(); | |
this.tb1.Text = ConfigurationManager.Instance.ServerAddress.ToString(); | |
} | |
private string path = "CONFIG\\System.xml"; | |
private void button1_Click(object sender, RoutedEventArgs e) | |
{ | |
ConfigurationManager.Instance.ServerAddress = this.tb1.Text; | |
ConfigurationManager.Instance.Save(path); | |
} | |
private void button2_Click(object sender, RoutedEventArgs e) | |
{ | |
Application.Current.Shutdown(); | |
} | |
private void Start() | |
{ | |
ConfigurationManager.Instance.Load(path); | |
} | |
} |