使用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.