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);
                }
            }
 
原文地址:https://www.cnblogs.com/tangge/p/2595011.html