zoukankan      html  css  js  c++  java
  • 1、c#对XML文件的解析

    1、XML文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <PersonF xmlns="" Name="(test)work hard work smart!">
     3   <person Name="Person1">
     4     <ID>1</ID>
     5     <Name>XiaoA</Name>
     6     <Age>59</Age>
     7   </person>
     8   <person Name="Person2">
     9     <ID>2</ID>
    10     <Name>XiaoB</Name>
    11     <Age>29</Age>
    12   </person>
    13   <person Name="Person3">
    14     <ID>3</ID>
    15     <Name>XiaoC</Name>
    16     <Age>103</Age>
    17   </person>
    18   <person Name="Person4">
    19     <ID>4</ID>
    20     <Name>XiaoD</Name>
    21     <Age>59</Age>
    22   </person>
    23 </PersonF>

    2、程序代码

     1        string path = @"E:测试XML读取XML.xml";
     2             XmlDocument xd = new XmlDocument();
     3             try
     4             {
     5                 xd.Load(path);
     6                 switch (count)
     7                 {
     8                     case 0:
     9                         //1、读取单个节点的数据
    10                         XmlNode xn1= xd.SelectSingleNode("PersonF");
    11                         richTextBox1.Text = xn1.InnerText.ToString();
    12                         count++;break;
    13                     case 1:
    14                         //2、读取多个节点的数据
    15                         XmlNodeList xn2 = xd.SelectNodes("PersonF/person");
    16                         foreach (XmlNode xn in xn2)
    17                         {
    18                             richTextBox1.Text += xn.InnerText;
    19                         }
    20                         count++;break;
    21                     case 2:
    22                         //3.1、读取具体节点的具体值 如:Name属性为Person2的Name的InnerText
    23                         XmlNodeList xn3 = xd.DocumentElement.GetElementsByTagName("person");
    24                         foreach (XmlNode xn in xn3)
    25                         {
    26                             if (xn.Attributes["Name"].InnerText == "Person2")
    27                             {
    28                                 richTextBox1.Text += xn.InnerText;
    29                             }
    30                         }
    31                         count++; break;
    32                     case 3:
    33                         //3.2、读取ID为2所在的节点第二个子节点Name的InnerText
    34                         XmlNode xn4 = xd.SelectSingleNode("PersonF/person[ID=2]");
    35                         richTextBox1.Text = xn4.ChildNodes[1].InnerText;
    36                         count++; break;
    37                     case 4:
    38                         //3.3、找到ID为2的节点的父节点Name属性
    39                         XmlNodeList xn5 = xd.SelectNodes("//person//ID");//读取ID为2的节点
    40                         foreach (XmlNode xn in xn5)
    41                         {
    42                             if (xn.InnerText == "2")
    43                             {
    44                                 richTextBox1.Text += xn.ParentNode.Attributes["Name"].InnerText;
    45                             }
    46                         }
    47                         count++;break;
    48                     case 5:
    49                         //4、修改节点属性
    50                         XmlNode xn6 = xd.SelectSingleNode("PersonF");
    51                         xn6.Attributes["Name"].InnerText = "helloworld";
    52                         xd.Save(path);
    53                         count++; break;
    54                     case 6:
    55                         //5、添加自定义节点
    56                         XmlTextReader xr = new XmlTextReader(path);
    57                         XmlElement root = xd.DocumentElement;//根节点(最外层节点)
    58 
    59                         XmlElement newele = xd.CreateElement("person");//第二层节点
    60                         newele.SetAttribute("Name", "Person6");
    61 
    62                         XmlElement ele_id = xd.CreateElement("ID");//newele子节点
    63                         ele_id.InnerText = "5";
    64                         XmlElement ele_name = xd.CreateElement("Name");//newele子节点
    65                         ele_name.InnerText = "XiaoE";
    66                         newele.AppendChild(ele_id);
    67                         newele.AppendChild(ele_name);
    68                         root.AppendChild(newele);
    69 
    70                         xr.Close();
    71                         xd.Save(path);
    72 
    73                         count=0; break;
    74                 }
    75 
    76             }
    77             catch 
    78             {
    79                 Exception ex;
    80             }

     源码下载:http://pan.baidu.com/s/1dDRzZ4P

    3.XPath详解

     1)"/bookstore/book/price"

    XPath的开头是一个斜线(/)代表这是绝对路径,这可以选出所有路径符合这个模式的元素。这代表选出所有bookstore根节点下的book元素下的price元素。

    2)"//title"

    开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。这代表选出所有title元素。

    3)"/bookstore/book/author/*"

    使用星号(*)可以选择未知的元素。这代表选出bookstore根节点下的book节点下的anthor节点下的所有可能的节点。

    得到的结果:25 25 female

    4)"/bookstore/book/*/age"

    上面的语法会选出所有bookstore根节点下的book节点的隔一个层次的age节点。

    得到的结果为:25 25

    5)"/*/*/age"

    选取有两个层级的age元素,得到的结果为:100

    要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。

    6)"bookstore/book[1]/title"

     使用中括号可以选择分支。这代表选择bookstore根节点下第一个book节点的title节点。

    得到的结果为:C语言

    7)"bookstore/book[last()]/title"

     同样,这里表示选择最后一个节点,得到的结果是:数据结构

    8)"bookstore/book/author[sex]"

    这里表示选取所有带有sex元素并满足一定层次结构的author节点,得到的结果是:25female

    9)"/bookstore/book[price=66.5]/title"

     选取price元素值是66.5的book节点的title子节点,得到的结果是:数据结构

    10)"/bookstore/book/title | /bookstore/book/price"

     使用Or操作数(|)就可以选择一个以上的路径。这里表示选取符合一定层次结构的title元素与price元素

    其结果是:C语言 50 数据库 100 数据结构 66.5

     11)"//@name"

    XPath中,除了选择元素以外,也可以选择属性,属性都是以@开头。这里表示选取所有的name属性。

    其结果是:XIAO Wang

     12)"//author[@name]/age"

    这里表示选取所有具有name属性的author节点的age节点。其结果是:25 25

    13)"//*[@*]"

    选取所有有属性的节点。其结果是:25 25female

    14)"//author[@name='Wang']/sex"

    选取所有属性name值为Wang的author节点的sex子节点。其结果是:female

    小结:
    1. 读写整个XML最方便的方法是使用序列化反序列化。
    2. 如果您希望某个参数以Xml Property的形式出现,那么需要使用[XmlAttribute]修饰它。
    3. 如果您希望某个参数以Xml Element的形式出现,那么需要使用[XmlElement]修饰它。
    4. 如果您希望为某个List的项目指定ElementName,则需要[XmlArrayItem]
    5. 以上3个Attribute都可以指定在XML中的映射别名。
    6. 写XML的操作是通过XmlSerializer.Serialize()来实现的。
    7. 读取XML文件是通过XmlSerializer.Deserialize来实现的。
    8. List或Array项,请不要使用[XmlElement],否则它们将以内联的形式提升到当前类,除非你再定义一个容器类。

  • 相关阅读:
    计算机网络——TCP如何做到可靠数据传输
    计算机网络——TCP的流水线传输(超详细)
    计算机网络——TCP的拥塞控制(超详细)
    计算机网络——TCP的三次握手与四次挥手(超详细)
    计算机网络——多路复用与多路分解
    转:资源 | 我爱自然语言处理
    bootsect及setup
    python默认编码设置
    实例分析C程序运行时的内存结构
    matlab常用目录操作
  • 原文地址:https://www.cnblogs.com/wleaves/p/5085467.html
Copyright © 2011-2022 走看看