先来了解下操做XML所涉及到的几个类及之间的关系 若是你们发现少写了一些经常使用的方法,麻烦在评论中指出,我必定会补上的!谢谢你们html
* 1 XMLElement 主要是针对节点的一些属性进行操做
* 2 XMLDocument 主要是针对节点的CUID操做
* 3 XMLNode 为抽象类,作为以上两类的基类,提供一些操做节点的方法node
清楚了以上的关系在操做XML时会更清晰一点post
如下会对Xml的结点与属性作增 删 改 查的操做也知足了实际工做中的大部分状况 学习
先构造一棵XML树以下,其中也涉及到了写入xml文档的操做编码
1 public void CreatXmlTree(string xmlPath) 2 { 3 XElement xElement = new XElement( 4 new XElement("BookStore", 5 new XElement("Book", 6 new XElement("Name", "C#入门", new XAttribute("BookName", "C#")), 7 new XElement("Author", "Martin", new XAttribute("Name", "Martin")), 8 new XElement("Adress", "上海"), 9 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd")) 10 ), 11 new XElement("Book", 12 new XElement("Name", "WCF入门", new XAttribute("BookName", "WCF")), 13 new XElement("Author", "Mary", new XAttribute("Name", "Mary")), 14 new XElement("Adress", "北京"), 15 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd")) 16 ) 17 ) 18 ); 19 20 //须要指定编码格式,不然在读取时会抛:根级别上的数据无效。 第 1 行 位置 1异常 21 XmlWriterSettings settings = new XmlWriterSettings(); 22 settings.Encoding = new UTF8Encoding(false); 23 settings.Indent = true; 24 XmlWriter xw = XmlWriter.Create(xmlPath,settings); 25 xElement.Save(xw); 26 //写入文件 27 xw.Flush(); 28 xw.Close(); 29 }
而后获得以下的XML树url
1 <?xml version="1.0" encoding="utf-8"?> 2 <BookStore> 3 <Book> 4 <Name BookName="C#">C#入门</Name> 5 <Author Name="Martin">Martin</Author> 6 <Date>2013-10-11</Date> 7 <Adress>上海</Adress> 8 <Date>2013-10-11</Date> 9 </Book> 10 <Book> 11 <Name BookName="WCF">WCF入门</Name> 12 <Author Name="Mary">Mary</Author> 13 <Adress>北京</Adress> 14 <Date>2013-10-11</Date> 15 </Book> 16 </BookStore>
如下操做都是对生成的XML树进行操做spa
2.1 新增节点与属性.net
新增节点NewBook并增长属性Name="WPF"code
1 public void Create(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 6 var root = xmlDoc.DocumentElement;//取到根结点 7 XmlNode newNode = xmlDoc.CreateNode("element", "NewBook", ""); 8 newNode.InnerText = "WPF"; 9 10 //添加为根元素的第一层子结点 11 root.AppendChild(newNode); 12 xmlDoc.Save(xmlPath); 13 }
开篇有写操做xml节点属性主要用XmlElement对象因此取到结点后要转类型 xml
1 //属性 2 public void CreateAttribute(string xmlPath) 3 { 4 XmlDocument xmlDoc = new XmlDocument(); 5 xmlDoc.Load(xmlPath); 6 var root = xmlDoc.DocumentElement;//取到根结点 7 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 8 node.SetAttribute("Name", "WPF"); 9 xmlDoc.Save(xmlPath); 10 11 }
效果以下
2.2 删除节点与属性
1 public void Delete(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 var root = xmlDoc.DocumentElement;//取到根结点 6 7 var element = xmlDoc.SelectSingleNode("BookStore/NewBook"); 8 root.RemoveChild(element); 9 xmlDoc.Save(xmlPath); 10 }
删除属性
1 public void DeleteAttribute(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 6 //移除指定属性 7 node.RemoveAttribute("Name"); 8 //移除当前节点全部属性,不包括默认属性 9 //node.RemoveAllAttributes(); 10 xmlDoc.Save(xmlPath); 11 }
2.3 修改节点与属性
xml的节点默认是不容许修改的,本文也就不作处理了
修改属性代码以下
1 public void ModifyAttribute(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 6 element.SetAttribute("Name", "Zhang"); 7 xmlDoc.Save(xmlPath); 8 }
效果以下
2.4 获取节点与属性
1 public void Select(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 //取根结点 6 var root = xmlDoc.DocumentElement;//取到根结点 7 //取指定的单个结点 8 XmlNode oldChild = xmlDoc.SelectSingleNode("BookStore/NewBook"); 9 10 //取指定的结点的集合 11 XmlNodeList nodes = xmlDoc.SelectNodes("BookStore/NewBook"); 12 13 //取到全部的xml结点 14 XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*"); 15 }
属性
1 public void SelectAttribute(string xmlPath) 2 { 3 XmlDocument xmlDoc = new XmlDocument(); 4 xmlDoc.Load(xmlPath); 5 XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook"); 6 string name = element.GetAttribute("Name"); 7 Console.WriteLine(name); 8 }
Linq to Xml 也没什么变化只操做对象改变了主要涉及的几个对象以下 注:我并无用linq的语法去操做元素。
XDocument:用于建立一个XML实例文档
XElement:用于一些节点与节点属性的基本操做
如下是对Xml的 一些简单的操做
3.1 新增节点与属性
1 public void Create(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 XElement xElement = xDoc.Element("BookStore"); 5 xElement.Add(new XElement("Test", new XAttribute("Name", "Zery"))); 6 xDoc.Save(xmlPath); 7 }
属性
1 public void CreateAttribute(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 IEnumerable<XElement> xElement = xDoc.Element("BookStore").Elements("Book"); 5 foreach (var element in xElement) 6 { 7 element.SetAttributeValue("Name", "Zery"); 8 } 9 xDoc.Save(xmlPath); 10 }
3.2 删除节点与属性
1 public void Delete(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 XElement element = (XElement)xDoc.Element("BookStore").Element("Book"); 5 element.Remove(); 6 xDoc.Save(xmlPath); 7 }
属性
1 public void DeleteAttribute(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 //不能跨级取节点 5 XElement element = xDoc.Element("BookStore").Element("Book").Element("Name"); 6 element.Attribute("BookName").Remove(); 7 xDoc.Save(xmlPath); 8 }
3.3 修改节点属性
节点.net没提供修改的方法本文也不作处理
修改属性与新增实质是同一个方法
1 public void ModifyAttribute(string xmlPath) 2 { 3 XDocument xDoc = XDocument.Load(xmlPath); 4 XElement element = xDoc.Element("BookStore").Element("Book"); 5 element.SetAttributeValue("BookName","ZeryTest"); 6 xDoc.Save(xmlPath); 7 }
本文转自Zery-zhang,转载是为了更好的记录,记录是为了更好地学习