XML文件的读取

来源:互联网 发布:linux vsftpd配置详解 编辑:程序博客网 时间:2024/05/22 11:48

最近项目涉及到Xml文件的读取,所有查找了一些xml文件的读取编辑方式,总结如下:

XML文件读取方法:

      <1>.XmlDocument 方式:需要将整个Xml文件加载到内存中

      <2>.XmlTextReader 方式:不需要将整个Xml文件加载到内存,但是只能向下读取(大型xml文件适用)

      <3>.Linq to Xml 方式:配合linq查询语法容易理解

[1]使用XMLDocument

[1.1]读取所有数据

XmlDocument xmldoc=new XmlDocument();//创建XMLDocument对象   XmlReaderSettings settings=new XmlReaderSettings();   settings.IgnoreComments=true;//忽视注释   XmlReader reader=XmlReader.Create(@"",settings);   xmldoc.Load(reader);//加载Xml文件       XmlNode node=xmldoc.SelectSingleNode("bookstore");//得到根节点    XmlNodeList nodec=node.ChlidNodes;//得到bookstroe节点下的所有子节点    for(XmlNode node in nodec){       XmlElement xenode=(XmlElement)node;//将节点转化为元素,以便得到节点属性            var s=xenode.GetAttribute("ISBN").ToString();/得到指定名称的属性值       XmlNodeList nodecc=xemodel.ChildNodes;       nodecc.Item(index).innerText;//得到当前节点的下标为index的子节点的值      }    reader.Close();//最后读取完毕,关掉reader

[1.2]添加节点

      1.xmlDocument加载xml文件

      2.selectSingleNode获取节点

     3.CreateElement 创建元素(节点)

     4.Appendhild 添加节点

     5.SetAttributeNode 设置节点属性

    XmlDocument xmldoc=new XmlDocument();     doc.Load(@"..\..\..\**.xml");     XmlNode root=xmldoc.SelectSingNode("bookstore");//找到跟节点     XmlElement node=xmldoc.CreateElement("book");//创建新元素node [book为元素名称:<book Type="ssss"> </book> ]     XmlAttribute nodeAttr=xmldoc.CreateAttribute("Type");//创建元素属性对象       nodeAttr.InnerText="ssss";//设置元素属性值       node.SetAttributeNOde(nodeAttr);//将属性设置为新元素book的属性     XmlElement nodec=xmldoc.CreateElement("author");//创建新元素nodec [author元素名称:<author>dddd</author>]       nodec.InnerText="dddd";//设置元素文本内容       node.AppendChild(nodec);//将nodec子元素添加到node内  [<book Type="ssss"> <author>dddd</author>  </book>]     root.AppendChild(node);//最后将新元素添加到跟节点中     xmldoc.Save(@"..\..\..\**.xml");//保存文件到指定路径

[1.3]清除所有数据

    XmlDocument xmldoc=new XMLDocument();    xmldoc.load("");

[1.4]删除节点
    SelectSingleNode可以传入一个Xpath表 来找到节点    XmlElement xe=xmldoc.DocumentElement; //DocumentElement获取xml文档对象的根XmlElement    string strPath = string.Format("/bookstore/book[@ISBN=\"{0}\"]", dgvBookInfo.CurrentRow.Cells[1].Value.ToString());    XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);     selectXe.ParentNode.RemoveChild(selectXe);

[1.5]修改节点
    1.用Xpath表达是找到要修改的节点
     2.SetAttribute设置节点属性值

   XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement.   string strPath = string.Format("/bookstore/book[@ISBN=\"{0}\"]", dgvBookInfo.CurrentRow.Cells[1].Value.ToString());   XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.     selectXe.SetAttribute("Type", dgvBookInfo.CurrentRow.Cells[0].Value.ToString());//也可以通过SetAttribute来增加一个属性   selectXe.GetElementsByTagName("title").Item(0).InnerText = dgvBookInfo.CurrentRow.Cells[2].Value.ToString();   selectXe.GetElementsByTagName("author").Item(0).InnerText = dgvBookInfo.CurrentRow.Cells[3].Value.ToString();      xmlDoc.Save(@"..\..\Book.xml");
[2]XmlTextReader XmlTextWriter [流形式]
[2.1]读取数据

 XmlTextReader reader=new XmlTextReader(path);//path为xml文件路径    while(reader.Read()){       if(reader.NodeType==XmlNodeType.Element){           switch(reader.Name){            case "book":               reader.GetAttribute(0);//获取节点指定索引的属性值               reader.GetAttribute(1);            case "title":               reader.ReadElementString().Trim();            case "author":               reader.ReadeElementString().Trim();           }       }       if(reader.NodeType==XmlNodeType==EndElement){           booklist.Add(model);           model=new Book();       }              }  bookList.RemoveAt(modelList.Count-1);
补充:上述读取属性值,需事先知道节点有几个属性值
            MoveToAttribute
   if(reader.Name=="book"){    for(int i=0;i<reader.AttributeCount;i++){       reader.MoveToAttribute(i);       string str = "属性:" + reader.Name + "=" + reader.Value;     }    reader.GetAttribute(0);    reader.GetAttribute(1);  }
[2.2]XmlTextWriter 写xml文件时默认覆盖原文件,如果原文件不存在则创建新文件
            WriteStartElement创建元素:
            1.WriteStartElement   2.创建子元素          3.WriteEndElement
              WriteElementString用来创建单个元素。
             WriteAttributeString用来创建属性。

    XmlTextWriter xmlWriter = new XmlTextWriter(@"..\..\Book1.xml", null);       xmlWriter.Formatting=Formatting.Indented;//使用 Formatting 属性指定 XML 设定为何种格式。子元素就可以通过使用 Indentation 和 IndentChar 属性来缩进。    xmlWriter.WriteStartDocument(flase);    xmlWriter.WriteStartElement("bookstore");//创建跟节点    xmlWriter.WriteComment("图书信息");//创建注释    xmlWriter.WriteStartElement("book");//创建图书节点    xmlWriter.WriteAttributeString("Type", "选修课");//创建设置属性值    xmlWriter.WriteAttributeString("ID", "111111111");    xmlWriter.WriteElementString("author","卡耐基");//创建单个节点    xml.Writer.WriteElementString("title", "人性的弱点");    xml.Writer.WriteElementString("price", "56.00");    xmlWriter.WriteEndElement();//图书节点创建完成    xmlWriter.WriteEndElement();//根节点创建完成    xmlWriter.Flush();    xmlWriter.Close();


[3] Linq 查询读取 Xml文件 [3.1] 读取所有数据

   XElement xe = XElement.Load(@"..\..\Book.xml");   IEnumerable<XElement> elements = from ele in xe.Elements("book") select ele;//查询出所有标签名book的元素   foreach (var node in elements)     {       node.Element("author").Value;//获取对应名称子元素的文本内容       node.Element("title").Value;       node.Element("price").Value;       node.Attribute("ID").Value;//获取属性值       node.Attribute("Type").Value;                    }

[3.2]插入数据 追加新节点到xml文件中

        XElement xe = XElement.Load(path);        XElement record = new XElement(           new XElement("book",              new XAttribute("Type", "选修课"),               new XAttribute("ID","1111111"),              new XElement("title", "计算机操作系统"),              new XElement("author", "xin"),              new XElement("price", 28.00)           )        );        xe.Add(record);        xe.Save(@"..\..\Book.xml");
[3.3] 删除数据 删除指定节点

      XElement xe = XElement.Load(@"..\..\Book.xml");    IEnumerable<XElement> elements = from ele in xe.Elements("book")                                     where (string)ele.Attribute("ID") == id                                     select ele;//linq查询出指定ID的节点    if(elements.Count()>0){         elements.First().Remove();    }    xe.Save(@"..\..\Book.xml");

删除所有节点

  XElement xe = XElement.Load(@"..\..\Book.xml");    IEnumerable<XElement> elements = from ele in xe.Elements("book") select ele;    if(elements.Count()>){            elements.Remove();    }    xe.Save(@"..\..\Book.xml");
[3.4]修改节点信息

   XElement xe = XElement.Load(@"..\..\Book.xml");  string id = dgvBookInfo.CurrentRow.Cells[1].Value.ToString();  IEnumerable<XElement> element =  from ele in xe.Elements("book")                                    where ele.Attribute("ID").Value == id                                    select ele;//查询查指定节点   if (element.Count() > 0){       XElement first=element.First();       first.SetAttributeValue("Type", dgvBookInfo.CurrentRow.Cells[0].Value.ToString());///设置新的属性        first.ReplaceNodes(             new XElement("title", dgvBookInfo.CurrentRow.Cells[2].Value.ToString()),              new XElement("author", dgvBookInfo.CurrentRow.Cells[3].Value.ToString()),              new XElement("price", (double)dgvBookInfo.CurrentRow.Cells[4].Value)        );//替换新的节点   }   xe.Save(@"..\..\Book.xml");
原创粉丝点击