zoukankan      html  css  js  c++  java
  • xml之基本操作

      XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized 
    Markup Language,标准通用标记语言)。它没有标签集(tag set),也没有语法规则(grammatical rule),但是它有句法规则(syntax rule)。
    任何XML文档对任何类型的应用以及正确的解析都必须是良构的(well-formed),即每一个打开的标签都必须有匹配的结束标签,不得
    含有次序颠倒的标签,并且在语句构成上应符合技术规范的要求。XML文档可以是有效的(valid),但并非一定要求有效。所谓有效文档是指其符合其文档
    类型定义(DTD)的文档。如果一个文档符合一个模式(schema)的规定,那么这个文档是"模式有效的(schema valid)"。
      XML文件在存储、交换和传输数据信息上有着很方便处理,那么今天这篇文章主要讲一下用C#如何实现对XML文件的基本操作,
    如:创建xml文件,增、删、改、查xml的节点信息。所使用的方法很基础,方便易懂(用于自己的学习和记忆只需,同时也希望能够给你带来一些帮助,
    如有不合适的地方欢迎大家批评指正)。
      本文的主要模块为:
        ① :生成xml文件
        ② :遍历xml文件的节点信息
        ③ :修改xml文件的节点信息
        ④ :向xml文件添加节点信息
        ⑤ :删除指定xml文件的节点信息
    • 假设我们需要设计出这样的一个xml文件来存储相应的信息,如下所示:
    <Computers>
    <Computer ID="11111111" Description="Made in China">
    <name>Lenovo</name>
    <price>5000</price>
    </Computer>
    <Computer ID="2222222" Description="Made in USA">
    <name>IBM</name>
    <price>10000</price>
    </Computer>
    </Computers>

      那么如何生成这个xml文件?又怎么读取这个xml文件的节点信息,以及如何对这个xml文件的节点信息作相应的操作?请看如下代码示例:
      【注:因为我们要使用xml相关的语法和方法,所以一定要引入命名空间 System.Xml】
    1 using System;
    2  using System.Collections.Generic;
    3  using System.Linq;
    4  using System.Text;
    5  using System.Xml;
    6
    7  namespace OperateXML
    8 {
    9 class Program
    10 {
    11 staticvoid Main(string[] args)
    12 {
    13 try
    14 {
    15 //xml文件存储路径
    16 string myXMLFilePath ="E:\MyComputers.xml";
    17 //生成xml文件
    18 GenerateXMLFile(myXMLFilePath);
    19 //遍历xml文件的信息
    20 GetXMLInformation(myXMLFilePath);
    21 //修改xml文件的信息
    22 ModifyXmlInformation(myXMLFilePath);
    23 //向xml文件添加节点信息
    24 AddXmlInformation(myXMLFilePath);
    25 //删除指定节点信息
    26 DeleteXmlInformation(myXMLFilePath);
    27 }
    28 catch (Exception ex)
    29 {
    30 Console.WriteLine(ex.ToString());
    31 }
    32 }
    33
    34 privatestaticvoid GenerateXMLFile(string xmlFilePath)
    35 {
    36 try
    37 {
    38 //初始化一个xml实例
    39 XmlDocument myXmlDoc =new XmlDocument();
    40 //创建xml的根节点
    41 XmlElement rootElement = myXmlDoc.CreateElement("Computers");
    42 //将根节点加入到xml文件中(AppendChild)
    43 myXmlDoc.AppendChild(rootElement);
    44
    45 //初始化第一层的第一个子节点
    46 XmlElement firstLevelElement1 = myXmlDoc.CreateElement("Computer");
    47 //填充第一层的第一个子节点的属性值(SetAttribute)
    48 firstLevelElement1.SetAttribute("ID", "11111111");
    49 firstLevelElement1.SetAttribute("Description", "Made in China");
    50 //将第一层的第一个子节点加入到根节点下
    51 rootElement.AppendChild(firstLevelElement1);
    52 //初始化第二层的第一个子节点
    53 XmlElement secondLevelElement11 = myXmlDoc.CreateElement("name");
    54 //填充第二层的第一个子节点的值(InnerText)
    55 secondLevelElement11.InnerText ="Lenovo";
    56 firstLevelElement1.AppendChild(secondLevelElement11);
    57 XmlElement secondLevelElement12 = myXmlDoc.CreateElement("price");
    58 secondLevelElement12.InnerText ="5000";
    59 firstLevelElement1.AppendChild(secondLevelElement12);
    60
    61
    62 XmlElement firstLevelElement2 = myXmlDoc.CreateElement("Computer");
    63 firstLevelElement2.SetAttribute("ID", "2222222");
    64 firstLevelElement2.SetAttribute("Description", "Made in USA");
    65 rootElement.AppendChild(firstLevelElement2);
    66 XmlElement secondLevelElement21 = myXmlDoc.CreateElement("name");
    67 secondLevelElement21.InnerText ="IBM";
    68 firstLevelElement2.AppendChild(secondLevelElement21);
    69 XmlElement secondLevelElement22 = myXmlDoc.CreateElement("price");
    70 secondLevelElement22.InnerText ="10000";
    71 firstLevelElement2.AppendChild(secondLevelElement22);
    72
    73 //将xml文件保存到指定的路径下
    74 myXmlDoc.Save(xmlFilePath);
    75 }
    76 catch (Exception ex)
    77 {
    78 Console.WriteLine(ex.ToString());
    79 }
    80 }
    81
    82 privatestaticvoid GetXMLInformation(string xmlFilePath)
    83 {
    84 try
    85 {
    86 //初始化一个xml实例
    87 XmlDocument myXmlDoc =new XmlDocument();
    88 //加载xml文件(参数为xml文件的路径)
    89 myXmlDoc.Load(xmlFilePath);
    90 //获得第一个姓名匹配的节点(SelectSingleNode):此xml文件的根节点
    91 XmlNode rootNode = myXmlDoc.SelectSingleNode("Computers");
    92 //分别获得该节点的InnerXml和OuterXml信息
    93 string innerXmlInfo = rootNode.InnerXml.ToString();
    94 string outerXmlInfo = rootNode.OuterXml.ToString();
    95 //获得该节点的子节点(即:该节点的第一层子节点)
    96 XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
    97 foreach (XmlNode node in firstLevelNodeList)
    98 {
    99 //获得该节点的属性集合
    100 XmlAttributeCollection attributeCol = node.Attributes;
    101 foreach (XmlAttribute attri in attributeCol)
    102 {
    103 //获取属性名称与属性值
    104 string name = attri.Name;
    105 string value = attri.Value;
    106 Console.WriteLine("{0} = {1}", name, value);
    107 }
    108
    109 //判断此节点是否还有子节点
    110 if (node.HasChildNodes)
    111 {
    112 //获取该节点的第一个子节点
    113 XmlNode secondLevelNode1 = node.FirstChild;
    114 //获取该节点的名字
    115 string name = secondLevelNode1.Name;
    116 //获取该节点的值(即:InnerText)
    117 string innerText = secondLevelNode1.InnerText;
    118 Console.WriteLine("{0} = {1}", name, innerText);
    119
    120 //获取该节点的第二个子节点(用数组下标获取)
    121 XmlNode secondLevelNode2 = node.ChildNodes[1];
    122 name = secondLevelNode2.Name;
    123 innerText = secondLevelNode2.InnerText;
    124 Console.WriteLine("{0} = {1}", name, innerText);
    125 }
    126 }
    127 }
    128 catch (Exception ex)
    129 {
    130 Console.WriteLine(ex.ToString());
    131 }
    132 }
    133
    134 privatestaticvoid ModifyXmlInformation(string xmlFilePath)
    135 {
    136 try
    137 {
    138 XmlDocument myXmlDoc =new XmlDocument();
    139 myXmlDoc.Load(xmlFilePath);
    140 XmlNode rootNode = myXmlDoc.FirstChild;
    141 XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
    142 foreach (XmlNode node in firstLevelNodeList)
    143 {
    144 //修改此节点的属性值
    145 if (node.Attributes["Description"].Value.Equals("Made in USA"))
    146 {
    147 node.Attributes["Description"].Value ="Made in HongKong";
    148 }
    149 }
    150 //要想使对xml文件所做的修改生效,必须执行以下Save方法
    151 myXmlDoc.Save(xmlFilePath);
    152 }
    153 catch (Exception ex)
    154 {
    155 Console.WriteLine(ex.ToString());
    156 }
    157
    158 }
    159
    160 privatestaticvoid AddXmlInformation(string xmlFilePath)
    161 {
    162 try
    163 {
    164 XmlDocument myXmlDoc =new XmlDocument();
    165 myXmlDoc.Load(xmlFilePath);
    166 //添加一个带有属性的节点信息
    167 foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
    168 {
    169 XmlElement newElement = myXmlDoc.CreateElement("color");
    170 newElement.InnerText ="black";
    171 newElement.SetAttribute("IsMixed", "Yes");
    172 node.AppendChild(newElement);
    173 }
    174 //保存更改
    175 myXmlDoc.Save(xmlFilePath);
    176 }
    177 catch (Exception ex)
    178 {
    179 Console.WriteLine(ex.ToString());
    180 }
    181 }
    182
    183 privatestaticvoid DeleteXmlInformation(string xmlFilePath)
    184 {
    185 try
    186 {
    187 XmlDocument myXmlDoc =new XmlDocument();
    188 myXmlDoc.Load(xmlFilePath);
    189 foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
    190 {
    191 //记录该节点下的最后一个子节点(简称:最后子节点)
    192 XmlNode lastNode = node.LastChild;
    193 //删除最后子节点下的左右子节点
    194 lastNode.RemoveAll();
    195 //删除最后子节点
    196 node.RemoveChild(lastNode);
    197 }
    198 //保存对xml文件所做的修改
    199 myXmlDoc.Save(xmlFilePath);
    200 }
    201 catch (Exception ex)
    202 {
    203 Console.WriteLine(ex.ToString());
    204 }
    205 }
    206 }
    207 }
    208
    上面的这个例子,首先是通过GenerateXMLFile方法在E盘创建出了我们预想的xml文件;然后通过GetXMLInformation方法对刚刚生成的xml文件进行了信息的读取;
    之后通过ModifyXmlInformation方法对xml文件信息作出相应的修改(<Computer ID="2222222" Description="Made in USA">
    修改成为<Computer ID="2222222" Description="Made in HongKong">);再之后通过AddXmlInformation方法向xml文件中添加了一个带有属性值的color节点;
    最后通过DeleteXmlInformation方法将刚刚添加上的color节点删除掉。至此完成了对xml文件的基本操作:创建、读取、修改、添加、删除。
    【注1:想要将对xml文件所做的任何修改生效的话,必须调用Save方法,否则我们所做的修改不会保存】
    【注2:我们在创建节点的时候用的是XmlElement,但是读取节点信息的时候却用的是XmlNode,这里强调一点:XmlElement是XmlNode的继承,可以调用更多的方法
        实现相应所需的功能】
      
      最后简单集中的总结一下对xml进行操作的基本方法,如下所示:
        //所需要添加的命名空间
        using System.Xml;
        //初始化一个xml实例
        XmlDocument xml=new XmlDocument();

        //导入指定xml文件
        xml.Load(“xml文件路径path”);

        //指定一个节点
        XmlNode root=xml.SelectSingleNode("节点名称");

        //获取节点下所有直接子节点
        XmlNodeList childlist=root.ChildNodes;

        //判断该节点下是否有子节点
        root.HasChildNodes;

        //获取同名同级节点集合
        XmlNodeList nodelist=xml.SelectNodes("节点名称");

        //生成一个新节点
        XmlElement node=xml.CreateElement("节点名称");

        //将节点加到指定节点下,作为其子节点
        root.AppendChild(node);

        //将节点加到指定节点下某个子节点前
        root.InsertBefore(node,root.ChildeNodes[i]);

        //为指定节点的新建属性并赋值
        node.SetAttribute("id","11111");

        //为指定节点添加子节点
        root.AppendChild(node);

        //获取指定节点的指定属性值
        string id=node.Attributes["id"].Value;

        //获取指定节点中的文本
        string content=node.InnerText;

        //保存XML文件
        xml.Save(“xml文件存储的路径path”);

    更多信息请看: http://www.cnblogs.com/fish-li/archive/2013/05/05/3061816.html
  • 相关阅读:
    使用apache的ab命令进行压测
    mysql插入数据时,去掉重复的数据;
    CI框架的事务开启、提交和回滚
    电脑如何自动玩popstar
    Outsider(HNOI2019)
    洛谷P4689 [Ynoi2016]这是我自己的发明(莫队,树的dfn序,map,容斥原理)
    Ubuntu下编写终端界面交互式C++小程序的一些Trick(小技巧,gnome-terminal)
    贪心相关/模拟网络流、费用流细节梳理/模板(贪心,模拟费用流,栈)
    洛谷P3602 Koishi Loves Segments(贪心,multiset)
    洛谷CF809C Find a car(数位DP)
  • 原文地址:https://www.cnblogs.com/quliang/p/6590218.html
Copyright © 2011-2022 走看看