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],否则它们将以内联的形式提升到当前类,除非你再定义一个容器类。

  • 相关阅读:
    [HNOI2002]营业额统计
    HDU 1374
    HDU 3345
    HDU 2089
    Graham扫描法
    Codeforces 1144D Deduction Queries 并查集
    Codeforces 916E Jamie and Tree 线段树
    Codeforces 1167F Scalar Queries 树状数组
    Codeforces 1167E Range Deleting
    Codeforces 749E Inversions After Shuffle 树状数组 + 数学期望
  • 原文地址:https://www.cnblogs.com/wleaves/p/5085467.html
Copyright © 2011-2022 走看看