zoukankan      html  css  js  c++  java
  • LINQ to XML

    读写XML有很多技术,Dom、Sax等,还有高级的读写技术XmlSerializer、 Linq To XML(System.Xml.Linq)、 System.Xml(XMLDocument)等, XmlSerializer要求对每种不同的文件都定义一套类,很麻烦,而Linq To XML则不需要单独创建类,当然更底层一些,代码比XmlSerializer多,灵活性更高。System.Xml下的类是2.0及之前操作xml推荐的,现在很多人也仍然在用这个namespace下的类,这个namespace下的类和Linq To XML非常相似,因此不用单独学。
    核心类XElement,一个XElement表示一个节点,new XElement("Order");创建一个名字为Order的标签,调用Add增加子节点,也是XElement 对象,和TreeView一样。
    想得到字符串怎么办?ToString
    调用XElement的Save方法将xml内容保存在Writer中

    image

    1.xElement

    表示一个 XML 元素。

    命名空间: System.Xml.Linq
    程序集: System.Xml.Linq(在 System.Xml.Linq.dll 中)

    static void Main(string[] args)
            {
                XElement xPerson = new XElement("Persons");
                XElement xMan = new XElement("Person");
                XElement xWoman = new XElement("Person");
     
                xMan.Value = "Jerry";  
                xMan.SetAttributeValue("hand",2); //设置节点属性
                //错误的写法:xMan.Attribute("age").Value = "30";
    xPerson.Add(xMan);
                xPerson.Add(xWoman);
     
                string xml = xPerson.ToString();
                Console.WriteLine(xml);
                Console.ReadKey();
            }
     

    image

    2.XDocument

    表示 XML 文档。

    命名空间: System.Xml.Linq
    程序集:System.Xml.Linq(在 System.Xml.Linq.dll 中)

    XDocument doc = XDocument.Load(reader),加载XML文件,XDocument就是加载的对象

    显示行号 复制代码 progam.cs
    1. using (Stream stream = File.OpenRead(@"../../app.xml"))
      
    2.             {
      
    3.                 using (StreamReader reader = new StreamReader(stream))
      
    4.                 {
      
    5.                     XDocument xdoc = XDocument.Load(reader);
      
    6.                     //xdoc.Root //XDocument的Root属性表示根节点
      
    7.                     //读取根节点的v1属性:111
      
    8. string v1 = xdoc.Root.Attribute("v1").Value;//读取根节点的属性
      
    9. Console.WriteLine(v1);
      
    10.                     //读取子节点的数量:2
      
    11. Console.WriteLine(xdoc.Root.Nodes().Count());
      
    12.                     //读取第1个子节点:<Person age="25">xMan</Person>
      
    13. XNode node = xdoc.Root.Nodes().ElementAt(0);
      
    14.                     Console.WriteLine(node);
      
    15.                     //读取xMan的属性age:25
      
    16. XElement xe1 = (XElement)node;
      
    17.                     string xMan = xe1.Value;//元素
      
    18. string age = xe1.Attribute("age").Value;//属性
      
    19. Console.WriteLine("{0}的属性age为:{1}.", xMan, age);
      
    20.                     Console.ReadKey();
      
    21.                 }
      
    22.             }
      

    image

    3.读取节点<connectionStrings>add的属性

    显示行号 复制代码 app.config
    1. <?xml version="1.0" encoding="utf-8" ?>
      
    2. <configuration>
      
    3.   <!--fffff-->
      
    4.   <connectionStrings>
      
    5.     <add name="c1" connectionString="DateSource=....."/>
      
    6.     <add name="c2" connectionString="DateSource=127.0.0.1"/>
      
    7.   </connectionStrings>
      
    8.   <!--aaaaa-->
      
    9. </configuration>
      

    显示行号 复制代码 Program.cs
    1. using (Stream stream = File.OpenRead(@"../../app.config"))
      
    2. {
      
    3.     using (StreamReader reader = new StreamReader(stream))
      
    4.     {
      
    5.         XDocument xdoc = XDocument.Load(reader);
      
    6.         IEnumerable<XElement> connectrs = 
      
    7.                 xdoc.Root.Elements("connectionStrings");
      
    8.         if (connectrs.Count()==1)
      
    9.         {
      
    10.             XElement xCon = connectrs.ElementAt(0);
      
    11.             foreach (XElement item in xCon.Elements("add"))
      
    12.             {
      
    13.                 string name = item.Attribute("name").Value;
      
    14.                 string connstr = item.Attribute("connectionString").Value;
      
    15.                 Console.WriteLine("名字:{0},字符串:{1}", name, connstr);
      
    16.             }
      
    17.         }
      
    18.     }
      
    19. }
      
    20. Console.ReadKey();
      

    image

    4.练习读取属性NavigationPage的值

    显示行号 复制代码 WMappManifest.xml
    1. <?xml version="1.0" encoding="utf-8" ?>
      
    2. <Persons v1="111">
      
    3.     <add  name="Jerry">
      
    4.       <Tasks>
      
    5.         <Name>NRG</Name>
      
    6.         <DefaulTask NavigationPage="DemoPage1.xmal">HOT</DefaulTask>
      
    7.       </Tasks>
      
    8.     </add>
      
    9. </Persons>
      

    代码如下:

    using (Stream stream = File.OpenRead(@"../../WMappManifest.xml"))
                {
                    using (StreamReader reader =new StreamReader(stream))
                    {
                        XDocument xdoc = XDocument.Load(reader);
                        var data = xdoc.Root.Element("add").Element("Tasks").Element("DefaulTask");
                        Console.WriteLine(data.Attribute("NavigationPage").Value);
     
                    }
                }
     

    image

    Descendants()的用法:

    有且只有1个节点,结果如上图

    using (Stream stream = File.OpenRead(@"../../WMappManifest.xml"))
                {
                    using (StreamReader reader =new StreamReader(stream))
                    {
                        XDocument xdoc = XDocument.Load(reader);
                        //var data = xdoc.Root.Element("add").Element("Tasks").Element("DefaulTask");
                        //Console.WriteLine(data.Attribute("NavigationPage").Value);                  
                        //Descendants()有且只有唯一子节点,
                        //慎用,容易取错点
                        var Adata=xdoc.Descendants("DefaulTask").Single();
                        Console.WriteLine(Adata.Attribute("NavigationPage").Value);
                    }
                }
     
  • 相关阅读:
    POJ 3630 Phone List/POJ 1056 【字典树】
    HDU 1074 Doing Homework【状态压缩DP】
    POJ 1077 Eight【八数码问题】
    状态压缩 POJ 1185 炮兵阵地【状态压缩DP】
    POJ 1806 Manhattan 2025
    POJ 3667 Hotel【经典的线段树】
    状态压缩 POJ 3254 Corn Fields【dp 状态压缩】
    ZOJ 3468 Dice War【PD求概率】
    POJ 2479 Maximum sum【求两个不重叠的连续子串的最大和】
    POJ 3735 Training little cats【矩阵的快速求幂】
  • 原文地址:https://www.cnblogs.com/tangge/p/2595011.html
Copyright © 2011-2022 走看看