XML文件的读取

最近项目涉及到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为元素名称:  ]
     XmlAttribute nodeAttr=xmldoc.CreateAttribute("Type");//创建元素属性对象
       nodeAttr.InnerText="ssss";//设置元素属性值
       node.SetAttributeNOde(nodeAttr);//将属性设置为新元素book的属性
     XmlElement nodec=xmldoc.CreateElement("author");//创建新元素nodec [author元素名称:dddd]
       nodec.InnerText="dddd";//设置元素文本内容
       node.AppendChild(nodec);//将nodec子元素添加到node内  [ dddd  ]
     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    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 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 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 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 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");

你可能感兴趣的:(.net)