使用linq to xml可以很方便的实现对xml文件的访问,在网上看到的写的这方面的帖子都稍微有一些混乱。今天博客园主页上转过来的那篇文章写的也比较不清楚,下面把我在平常中使用linq to xml访问文件的方式写下来,供没有写过的兄弟参考:
首先第一步是选中要访问xml文件的属性copy to out(如test.xml),选择always,这步的意思是这个xml文件始终会被输出到可执行文件所在的文件夹,这样我们才可以直接使用不带路径的文件名来访问它。下面来看这个xml文件的内容:
////////////////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="utf-8" ?>
<Root>
<!--第一种xml的格式-->
<FirstStyle>
<Test>one</Test>
<Test>two</Test>
<Test>three</Test>
</FirstStyle>
<!--第二种xml格式,配置文件中常用的格式-->
<SecondStyle>
<Test_ name="firstname" value="xu"/>
<Test_ name="lastname" value="jin"/>
<Test_ name="lastname" value="lin"/>
</SecondStyle>
<!--第三种xml格式,搭配前两种-->
<ThirdSytle>
<Test1 name="test1">test1_value</Test1>
</ThirdSytle>
</Root>
//////////////////////////////////////////////////////////////////
<Root></Root>只是表明xml的根节点,<FirstSytle></FirstStyle>定义第一种格式,可以无限嵌套节点,<Test>是<FirstStyle>的一个多值嵌套子节点,节点中已经赋了三个“值”:one two three ,在后面的代码中,将说明怎么读取这几个值。<SecondStyle> 定义第二种格式,<Test_>节点中没有“值”,但是却增加了“属性”name 和 value ,属性的名字可以自定义。我们在后面也会说明如何读取这些属性里面的值。这两种方式可以配合使用,就是xml中的第三种模式,不做另外的说明,在下面的访问代码中也没有做访问实例,可以参考前两种自己组合,下面来看代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace LinqXml
{
class Program
{
static void Main(string[] args)
{
//第一种xml格式的读法
var firstCollection = from test in XElement.Load("test.xml").Element("FirstStyle").Elements("Test")
select test.Value;
foreach (string s in firstCollection)
{
Console.WriteLine(s);
}
//第二种xml格式的读法
var secondCollection = from test in XElement.Load("test.xml").Element("SecondStyle").Elements("Test_")
where test.Attribute("name").Value.Equals("lastname")
select test.Attribute("value").Value;
foreach (string s in secondCollection)
{
Console.WriteLine(s);
}
}
}
}
在进行xml节点选择的时候,自外而内,跟节点不用选,使用节点名称选择。如果该节点是单节点(如几种Style的节点),则应该用Element("")来选择,如果是多节点(如<Test>),则必须使用Elements("")来选择,如果选用Element(""),则只会返回该类节点的第一个。linq 语法稍微解释一下,from制定选择的范围,where指定选择的条件,selete 指定选择的目标。如果不明白可以把代码实践一下调试看看,有不同想法的兄弟联系我吧: zhaotiantang520@live.cn.