对xml文件的操作,看过很过博文,里面的和书籍上写的都很类似——简单。因为简单才能阐述得很清晰明了,但实际编程的时候就需要变通能力、或者编程功底。对于之前未接触过的新手来说,可要花上几个小时来消化理解。
当然对于文件操作的方式有很多种,比如封装一个可序列化的类,然后向本机系列化存档,需要的时候反序列即可得到之前存档的信息。但是该方法存档的是一种特殊的格式,不能用一般的文件打开(比如记事本);xml就可以用记事本打开查看内容,有些特别需要的时候用xml是一个很不错的选择。为了xml新手更快的消化吸收xml文件的操作,同时使自己更容易理解,自己做了这篇博文<涉及比较全,但也不复杂>。
<books> <!--分类(计算机和文学类)--> <programmers> <!--书籍 计算机书 3本,文学类 1本--> <book name="The C++ Programming Language" author="Bjarne Stroustrup"> <!--系列书籍 版次号,可加上出版时间等额外信息(属性)--> <Version added="Special Edition (3rd Edition)" /> </book> <book name="C++ Primer" author="Stanley B. Lippman"> <Version added="Special Edition (4th Edition)" /> </book> <book name="Professional C# 4.0 and .NET 4" author="Christian Nagel .etc"> <Version added="Special Edition (7th Edition)" /> </book> </programmers> <arts> <book name="论语" author="孔子"> </book> </arts> </books>
一般用记事本就可以做出上面的xml文件,但是一般人会像自动产生上面的xml文件,对xml文件操作类进行简单的封装就可以实现上面的文件。
产生上面的xml操作code(需要命名空间 System.Xml):
public XmlOperator CreateXml(string rootXml,string pathName) { XmlOperator doc = new XmlOperator(); //根目录 由于XmlDocment.Load函数(重载函数在内,我试过两个函数)载入时都需要根元素,故在文件不存在的 //时候先载入一个xml根元素文件(如下),然后生成需要的xml文件保存为**.xml文件即可 doc.LoadXml(rootXml); //增加 计算机和文学类两种书籍 XmlNode rootNode = doc.GetNode("books"); doc.AppendNode(rootNode, doc.CreateNode(System.Xml.XmlNodeType.Element, "programmers", null)); doc.AppendNode(rootNode, doc.CreateNode(System.Xml.XmlNodeType.Element, "arts", null)); #region Books //计算机类 3本 XmlNode book1 = doc.CreateNode(System.Xml.XmlNodeType.Element, "book", null); doc.SetAttribute(book1, "name", "The C++ Programming Language"); doc.SetAttribute(book1, "author", "Bjarne Stroustrup"); //创建版次并加入本书系列 XmlNode book1v = doc.CreateNode(System.Xml.XmlNodeType.Element, "Version", null); doc.SetAttribute(book1v, "added", "Special Edition (3rd Edition)"); doc.AppendNode(book1, book1v); XmlNode book2 = doc.CreateNode(System.Xml.XmlNodeType.Element, "book", null); doc.SetAttribute(book2, "name", "C++ Primer"); doc.SetAttribute(book2, "author", "Stanley B. Lippman"); XmlNode book2v = doc.CreateNode(System.Xml.XmlNodeType.Element, "Version", null); doc.SetAttribute(book2v, "added", "Special Edition (4th Edition)"); doc.AppendNode(book2, book2v); XmlNode book3 = doc.CreateNode(System.Xml.XmlNodeType.Element, "book", null); doc.SetAttribute(book3, "name", "Professional C# 4.0 and .NET 4"); doc.SetAttribute(book3, "author", "Christian Nagel .etc"); XmlNode book3v = doc.CreateNode(System.Xml.XmlNodeType.Element, "Version", null); doc.SetAttribute(book3v, "added", "Special Edition (7th Edition)"); doc.AppendNode(book3, book3v); //文学类 1本 XmlNode bookart = doc.CreateNode(System.Xml.XmlNodeType.Element, "book", null); doc.SetAttribute(bookart, "name", "论语"); doc.SetAttribute(bookart, "author", "孔子"); #endregion XmlNode nodeBookP = doc.GetNode("books/programmers"); XmlNode nodeBookA = doc.GetNode("books/arts"); doc.AppendNode(nodeBookP, book1); doc.AppendNode(nodeBookP, book2); doc.AppendNode(nodeBookP, book3); doc.AppendNode(nodeBookA, bookart); doc.Save(pathName); return doc; }
查找某一本书(如C++ Primer),并修改其中的属性操作(注意每次修改之后必须保存操作<Save>):
string pathName = "test.xml"; string rootXml="<books></books>"; XmlOperator xml= CreateXml(rootXml, pathName); XmlNodeList programingBooks= xml.GetNodes("books/programmers/book"); if (programingBooks != null) { foreach (XmlNode book in programingBooks) { if (xml.GetAttribute(book, "name").Equals("C++ Primer")) { xml.SetAttribute(book, "name", "C++ Primer(中文版)"); } } } xml.Save(pathName);
操作结果为:
<book name="C++ Primer(中文版)" author="Stanley B. Lippman"> <Version added="Special Edition (4th Edition)" /> </book>
下面为对xml文件的封装类,封装可以随意的,由于编程功底,封装类不是很perfect。
1 public class XmlOperator 2 { 3 #region Members 4 private XmlDocument _doc; 5 #endregion 6 7 #region Constructors 8 public XmlOperator() 9 { 10 _doc = new XmlDocument(); 11 } 12 #endregion 13 14 #region Methods 15 public void Load(string pathName) 16 { 17 _doc.Load(pathName); 18 } 19 public void Load(System.IO.Stream inStream) 20 { 21 _doc.Load(inStream); 22 } 23 public void LoadXml(string xml) 24 { 25 _doc.LoadXml(xml); 26 } 27 public XmlNode CreateNode(XmlNodeType nodeType, string nodeName,string namespaceURI) 28 { 29 return _doc.CreateNode(nodeType, nodeName, namespaceURI); 30 } 31 public XmlNode GetNode(string xpath) 32 { 33 return _doc.SelectSingleNode(xpath); 34 } 35 public XmlNode AppendNode(XmlNode parent, XmlNode child) 36 { 37 return parent.AppendChild(child); 38 } 39 public XmlNodeList GetNodes(string xpath) 40 { 41 return _doc.SelectNodes(xpath); 42 } 43 public XmlAttribute CreateAttribute(string name) 44 { 45 return _doc.CreateAttribute(name); 46 } 47 public void SetAttribute(XmlNode node, string name, string attriValue) 48 { 49 if (node.Attributes[name] == null) 50 { 51 XmlAttribute attri= CreateAttribute(name); 52 AppendAttribute(node, attri); 53 } 54 node.Attributes[name].Value = attriValue; 55 } 56 public XmlAttribute AppendAttribute(XmlNode node, XmlAttribute attri) 57 { 58 return node.Attributes.Append(attri); 59 } 60 public string GetAttribute(XmlNode node, string name) 61 { 62 return (node.Attributes[name]!=null)?node.Attributes[name].Value:null; 63 } 64 public void Save(string pathName) 65 { 66 _doc.Save(pathName); 67 } 68 #endregion 69 70 }
特别的:SelectSingleNode还可以按属性值查找格式为:[xpath[@属性名='属性值']]
例如查找 book节点下为name属性为C++ Primer的节点;
eg. _doc.SelectSingleNode("books/programmers/book[@name='C++ Primer'])(只能以绝对路径,不能以相对路径查找;
即当节点在programmers也不能以book[@name='C++ Primer']去查找,必须以books/programmers/book[@name='C++ Primer'])
总结: xml操作一般步骤:
1、新建XmlDocment对象
2、Load或LoadXml文件
3、对各个Node或Attribute操作(对于该部分操作,最好不要光看代码,这样很容易把自己搞晕掉;结合xml结构写code更清晰明了)
4、保存