zoukankan      html  css  js  c++  java
  • C# XML相关操作

    XML是一种意见单文本格式存储数据的方式,这意味着它可以被任何计算机读取。XML中完整的数据集就是XML文档。

     在名称空间System.Xml下面大部分类型都是用来支持DOM处理模型的。其中很多类型配合起来共同组织成XMLDOM,XMLDOM是一种很典型的文档对象模型的应用。文档对象模型是一种比较高级的软件设计模式,我会在今后的课程中详细介绍文档对象模型这种软件设计模式。

    类名 说明
    XmlNode 这个类表示文档的一个节点,它是许多类的基类。如果这个节点表示XML文档的根,就可以从它导航文档任意位置。
    XmlDocument 扩展了XmlNode类,但通常是使用XML的第一个对象,因为这个类用于加载磁盘或其他地方的数据,并在这些位置保存数据
    XmlElement 表示XML文档的一个元素。它派生于XmlLinkedNode,XmlLinkedNode派生于XmlNode
    XmlAttribute 表示一个特性,与XmlDocument类一样,它也派生于XmlNode类
    XmlText 表示开始标记于结束标记之间的文本
    XmlComment 表示一种特殊的类型的节点,这种节点不是文档的一部分,但位阅读器提供文档各部分信息
    XmlNodeList 表示一个节点的集合

    创建一个XML文档

           XmlDocument xmlDoc = new XmlDocument();
                ////创建Xml声明部分,即<?xml version="1.0" encoding="utf-8" ?>
                XmlDeclaration Declaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);

                xmlDoc.AppendChild(Declaration);
                ////创建根节点
                XmlNode rootNode = xmlDoc.CreateElement("root");


                ////创建student子节点
                XmlNode testPointNode = xmlDoc.CreateElement("testPoint");
                创建一个属性
              XmlAttribute testPointID = xmlDoc.CreateAttribute("TestPointID");
               testPointID.Value = "1";

              XmlAttribute caseID = xmlDoc.CreateAttribute("CaseId");
               caseID.Value = "TEST_0001";

                XmlAttribute name = xmlDoc.CreateAttribute("Name");
                name.Value = "111";

                ////xml节点附件属性
              testPointNode.Attributes.Append(testPointID);
               testPointNode.Attributes.Append(caseID);
               testPointNode.Attributes.Append(name);
              rootNode.AppendChild(testPointNode);


                ////附加根节点
                xmlDoc.AppendChild(rootNode);
               ////保存Xml文档
              xmlDoc.Save(@"d: estPoint.xml");

    结果:

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <testPoint TestPointID="1" CaseId="TEST_0001" Name="111" />
    </root>

    另外一种方法:

          XmlDocument doc = new XmlDocument();
                XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "GB2312", null);
                doc.AppendChild(dec);
                //创建一个根节点(一级)
                XmlElement root = doc.CreateElement("First");
                doc.AppendChild(root);
                //创建节点(二级)
                XmlNode node = doc.CreateElement("Seconde");
                root.AppendChild(node);
                //创建节点(三级)
                XmlElement element1 = doc.CreateElement("Third1");
                element1.SetAttribute("Name", "Sam");
                element1.SetAttribute("ID", "665");
                element1.InnerText = "Sam Comment";
                node.AppendChild(element1);
                doc.Save(@"d:b.xml");

    结果:

    <?xml version="1.0" encoding="GB2312"?>
    <First>
      <Seconde>
        <Third1 Name="Sam" ID="665">Sam Comment</Third1>
      </Seconde>
    </First>

    注意:在这里面 XmlNode和XmlElement可以互换,其结果不变。但这两者之间有区别,需要规范操作。

    Element是Node的扩展,所以也更实用一些。例如,用Element可以方便的获得Node的属性getAttribute(String attrName)如果用Node,可以得到一个属性集,还要进一步检索才可得到想要的属性。一个结点不一定是一个元素,而一个元素一定是一个结点。  Element是Node的子集,XmlNode表示一个节点,包括XmlElement(元素)和XmlAttribute(属性)等。

    又一种方法:(对应结果查看之间关系)

    XmlTextWriter  表示提供快速、非缓存、只进方法的编写器,该方法生成包含 XML 数据(这些数据符合 W3C 可扩展标记语言 (XML) 1.0 和“XML 中的命名空间”建议)的流或文件。

               XmlTextWriter xmlWriter;
                string strFilename = @"d:55555555555555.xml";

                xmlWriter = new XmlTextWriter(strFilename, Encoding.Default);//创建一个xml文档
                xmlWriter.Formatting = Formatting.Indented;//输出格式设置
                xmlWriter.WriteStartDocument();
                xmlWriter.WriteStartElement("Employees");

                xmlWriter.WriteStartElement("Node");
                xmlWriter.WriteAttributeString("genre", "李赞红");
                xmlWriter.WriteAttributeString("ISBN", "2-3631-4");

                xmlWriter.WriteStartElement("title");
                xmlWriter.WriteString("CS从入门到精通");
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("author");
                xmlWriter.WriteString("候捷");
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("price");
                xmlWriter.WriteString("58.3");
                xmlWriter.WriteEndElement();

                xmlWriter.WriteEndElement();

                xmlWriter.WriteEndElement();

                xmlWriter.Close();

    结果:

    <?xml version="1.0" encoding="gb2312"?>
    <Employees>
      <Node genre="李赞红" ISBN="2-3631-4">
        <title>CS从入门到精通</title>
        <author>候捷</author>
        <price>58.3</price>
      </Node>
    </Employees>

    创建xml文档的方法,多种多样,可以根据XML不同的类和方法来创建。

    XML添加

    XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(@"d:55555555555555.xml");

                XmlNode root = xmlDoc.SelectSingleNode("Employees");//查找<Employees>
                XmlElement xe1 = xmlDoc.CreateElement("Node");//创建一个<Node>节点
                xe1.SetAttribute("genre", "张三");//设置该节点genre属性
                xe1.SetAttribute("ISBN", "1-1111-1");//设置该节点ISBN属性

                XmlElement xesub1 = xmlDoc.CreateElement("title");
                xesub1.InnerText = "C#入门帮助";//设置文本节点
                xe1.AppendChild(xesub1);//添加到<Node>节点中
                XmlElement xesub2 = xmlDoc.CreateElement("author");
                xesub2.InnerText = "高手";
                xe1.AppendChild(xesub2);
                XmlElement xesub3 = xmlDoc.CreateElement("price");
                xesub3.InnerText = "158.3";
                xe1.AppendChild(xesub3);

                root.AppendChild(xe1);//添加到<Employees>节点中
                xmlDoc.Save(@"d:55555555555555.xml");

    另一种方法:

     XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(@"d:55555555555555.xml");
                XmlNode root = xmlDoc.SelectSingleNode("Employees");//查找<Employees>
                XmlElement xe1 = xmlDoc.CreateElement("Node");//创建一个<Node>节点
                xe1.SetAttribute("genre", "张三");//设置该节点genre属性
                xe1.SetAttribute("ISBN", "1-1111-1");//设置该节点ISBN属性
                //创建三个节点
                XmlElement xesub1 = xmlDoc.CreateElement("title");
                XmlElement xesub2 = xmlDoc.CreateElement("author");
                XmlElement xesub3 = xmlDoc.CreateElement("price");
                //在对应三个节点里加内容
                XmlText title = xmlDoc.CreateTextNode("C#入门帮助");
                XmlText author = xmlDoc.CreateTextNode("高手");
                XmlText price = xmlDoc.CreateTextNode("158.3");

                xesub1.AppendChild(title);
                xesub2.AppendChild(author);
                xesub3.AppendChild(price);

                xe1.AppendChild(xesub1);
                xe1.AppendChild(xesub2);
                xe1.AppendChild(xesub3);

                root.AppendChild(xe1);//添加到<Employees>节点中
                xmlDoc.Save(@"d:55555555555555.xml");

    结果:

    <?xml version="1.0" encoding="gb2312"?>
    <Employees>
      <Node genre="李赞红" ISBN="2-3631-4">
        <title>CS从入门到精通</title>
        <author>候捷</author>
        <price>58.3</price>
      </Node>
      <Node genre="张三" ISBN="1-1111-1">
        <title>C#入门帮助</title>
        <author>高手</author>
        <price>158.3</price>
      </Node>
    </Employees>

    XML修改节点的值

      XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(@"d:55555555555555.xml");

                XmlNodeList nodeList = xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点
                foreach (XmlNode xn in nodeList)//遍历所有子节点
                {
                    XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
                    if (xe.GetAttribute("genre") == "张三")//如果genre属性值为“张三”
                    {
                        xe.SetAttribute("genre", "update张三");//则修改该属性为“update张三”

                        XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点
                        foreach (XmlNode xn1 in nls)//遍历
                        {
                            XmlElement xe2 = (XmlElement)xn1;//转换类型
                            if (xe2.Name == "author")//如果找到
                            {
                                xe2.InnerText = "亚胜";//则修改
                            }
                        }
                    }
                }
                xmlDoc.Save(@"d:55555555555555.xml");
            }
        }

    结果为:

    <?xml version="1.0" encoding="gb2312"?>
    <Employees>
      <Node genre="李赞红" ISBN="2-3631-4">
        <title>CS从入门到精通</title>
        <author>候捷</author>
        <price>58.3</price>
      </Node>
      <Node genre="update张三" ISBN="1-1111-1">
        <title>C#入门帮助</title>
        <author>亚胜</author>
        <price>158.3</price>
      </Node>
    </Employees>

      //(添加结点的属性和添加结点的自结点):
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(@"d:55555555555555.xml");
                XmlNodeList nodeList = xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点

                foreach (XmlNode xn in nodeList)
                {
                    XmlElement xe = (XmlElement)xn;
                    xe.SetAttribute("test", "111111");//添加属性

                    XmlElement xesub = xmlDoc.CreateElement("flag");//添加一个节点
                    xesub.InnerText = "1";
                    xe.AppendChild(xesub);
                }
                xmlDoc.Save(@"d:55555555555555.xml");
            }

    结果为:

    <?xml version="1.0" encoding="gb2312"?>
    <Employees>
      <Node genre="李赞红" ISBN="2-3631-4" test="111111">
        <title>CS从入门到精通</title>
        <author>候捷</author>
        <price>58.3</price>
        <flag>1</flag>
      </Node>
      <Node genre="update张三" ISBN="1-1111-1" test="111111">
        <title>C#入门帮助</title>
        <author>亚胜</author>
        <price>158.3</price>
        <flag>1</flag>
      </Node>
    </Employees>

    删除节点

    删除节点的某一个属性或某个子节点

    将上面紫色部分改为如下即可:

    xe.RemoveAttribute("genre");//删除genre属性

    xe.RemoveChild(xe2);//则删除子节点

    结果:

    <?xml version="1.0" encoding="gb2312"?>
    <Employees>
      <Node  ISBN="2-3631-4">
        <title>CS从入门到精通</title>
        <price>58.3</price>
      </Node>
      <Node  ISBN="1-1111-1">
        <title>C#入门帮助</title>
          <price>158.3</price>
      </Node>
    </Employees>

    删除一个节点所有内容

             XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(@"d:55555555555555.xml");
                XmlElement root=xmlDoc.DocumentElement;//获取根节点
                XmlNodeList nodeList = xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点

                foreach (XmlNode xn in nodeList)
                {
                    XmlElement xe = (XmlElement)xn;
                    if (xe.GetAttribute("genre") == "update张三")//
                    {
                        root.RemoveChild(xe);
                    }
                }
                xmlDoc.Save(@"d:55555555555555.xml");
            }

    结果:

    <?xml version="1.0" encoding="gb2312"?>
    <Employees>
      <Node genre="李赞红" ISBN="2-3631-4" test="111111">
        <title>CS从入门到精通</title>
        <author>候捷</author>
        <price>58.3</price>
        <flag>1</flag>
      </Node>
    </Employees>

    至于读取xml文档,在文件流里面仔细总结。部分例子来源其他博客。

  • 相关阅读:
    新建安卓项目后,manifest.xml中会出现大段的黄色警告
    TextView设置setCompoundDrawables不生效解决办法
    数据结构->队列->顺序循环队列ADT代码
    数据结构->栈->顺序栈ADT代码
    JAVA环境变量的配置
    计算机科学的范围-----18.12.08
    字符串复制
    扔鸡蛋问题和找零钱问题
    动态规划
    最小二乘法
  • 原文地址:https://www.cnblogs.com/anyihen/p/5506991.html
Copyright © 2011-2022 走看看