C#程序中使用LINQ to XML來(lái)查詢(xún)XML格式數(shù)據(jù)的實(shí)例
關(guān)于LINQ to XML
LINQ to XML 是一種啟用了 LINQ 的內(nèi)存 XML 編程接口,使用它,可以在 .NET Framework 編程語(yǔ)言中處理 XML。
它將 XML 文檔置于內(nèi)存中,這一點(diǎn)很像文檔對(duì)象模型 (DOM)。 您可以查詢(xún)和修改 XML 文檔,修改之后,可以將其另存為文件,也可以將其序列化然后通過(guò)網(wǎng)絡(luò)發(fā)送。 但是,LINQ to XML 與 DOM 不同: 它提供一種新的對(duì)象模型,這是一種更輕量的模型,使用也更方便,這種模型利用了 VisualC# 2008 在語(yǔ)言方面的改進(jìn)。
LINQ to XML 最重要的優(yōu)勢(shì)是它與 Language-Integrated Query (LINQ) 的集成。 由于實(shí)現(xiàn)了這一集成,因此,可以對(duì)內(nèi)存 XML 文檔編寫(xiě)查詢(xún),以檢索元素和屬性的集合。 LINQ to XML 的查詢(xún)功能在功能上(盡管不是在語(yǔ)法上)與 XPath 和 XQuery 具有可比性。 Visual C# 2008 集成 LINQ 后,可提供更強(qiáng)的類(lèi)型化功能、編譯時(shí)檢查和改進(jìn)的調(diào)試器支持。
通過(guò)將查詢(xún)結(jié)果用作 XElement 和 XAttribute 對(duì)象構(gòu)造函數(shù)的參數(shù),實(shí)現(xiàn)了一種功能強(qiáng)大的創(chuàng)建 XML 樹(shù)的方法。 這種方法稱(chēng)為“函數(shù)構(gòu)造”,利用這種方法,開(kāi)發(fā)人員可以方便地將 XML 樹(shù)從一種形狀轉(zhuǎn)換為另一種形狀。
LINQ to XML 提供了改進(jìn)的 XML 編程接口,這一點(diǎn)可能與 LINQ to XML 的 LINQ 功能同樣重要。 通過(guò) LINQ to XML,對(duì) XML 編程時(shí),您可以實(shí)現(xiàn)任何預(yù)期的操作,包括:
- 從文件或流加載 XML。
- 將 XML 序列化為文件或流。
- 使用函數(shù)構(gòu)造從頭開(kāi)始創(chuàng)建 XML。
- 使用類(lèi)似 XPath 的軸查詢(xún) XML。
- 使用 Add、Remove、ReplaceWith 和 SetValue 等方法對(duì)內(nèi)存 XML 樹(shù)進(jìn)行操作。
- 使用 XSD 驗(yàn)證 XML 樹(shù)。
使用這些功能的組合,可將 XML 樹(shù)從一種形狀轉(zhuǎn)換為另一種形狀。
實(shí)例
在前一段時(shí)間開(kāi)發(fā)的護(hù)士站項(xiàng)目中,我是for循環(huán)XMLReader的方式遍歷XML文件的。也能完成相關(guān)的需求,且函數(shù)封裝好了以后,可以直接調(diào)用,也挺方便。
下面用LINQ to XML來(lái)展現(xiàn)。具體更詳細(xì)的東西可以去查MSND。
客戶(hù)端的XML文件如下,為了展現(xiàn)方便我只取了3項(xiàng):
<?xml version="1.0"?> <ROWSET> <ROW> <就診序號(hào)>1</就診序號(hào)> <就診日期>2012-06-11</就診日期> <病人ID>00002468</病人ID> <姓名>吳建平</姓名> <性別>男</性別> <年齡>42</年齡> <就診科室>2981</就診科室> </ROW> <ROW> <就診序號(hào)>2</就診序號(hào)> <就診日期>2012-06-11</就診日期> <病人ID>00002467</病人ID> <姓名>蔡蕊</姓名> <性別>女</性別> <年齡>33</年齡> <就診科室>2981</就診科室> </ROW> <ROW> <就診序號(hào)>3</就診序號(hào)> <就診日期>2012-06-11</就診日期> <病人ID>412905</病人ID> <姓名>aaa</姓名> <性別>男</性別> <年齡>24</年齡> <就診科室>2981</就診科室> </ROW> </ROWSET>
怎么展現(xiàn)呢?關(guān)注Form1_Load方法如下:
using System;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
namespace Lint2XMLDatabinding
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string xmlFilePath = @"./當(dāng)前在科病人基本信息.xml";
XDocument doc = XDocument.Load(xmlFilePath);
var query = from p in doc.Descendants("ROW")//doc.Descendants("ROW")
where p.Element("就診序號(hào)").Value!="1"
select new { A = p.Element("就診序號(hào)").Value, B = p.Element("病人ID").Value, C = p.Element("姓名").Value ,D=p.Element("性別").Value };
dataGridView1.DataSource= query.ToList();
}
}
}
程序結(jié)果如下:

本篇博文用來(lái)示例的Demo很簡(jiǎn)單,目的單純?yōu)榱耸褂肔INQ。操作XML文件的方法有很多,不用LINQ當(dāng)然也沒(méi)什么問(wèn)題。
其實(shí),迄今為止,.NET Framework一共提供了兩套處理XML數(shù)據(jù)的類(lèi)庫(kù):
一、即DebugLZQ前面項(xiàng)目里用的的符合DOM標(biāo)準(zhǔn)的類(lèi)庫(kù):寶庫(kù)XmlDocument、XmlElement、XmlNode、XmlAttribute等類(lèi)。這套類(lèi)庫(kù)的特點(diǎn)是中規(guī)中矩、功能強(qiáng)大,但也背負(fù)了太多XML的傳統(tǒng)和復(fù)雜。
二、以LINQ為基礎(chǔ)的類(lèi)庫(kù):包括XDocument、XElement、XNode、XAttribute等類(lèi)。這套類(lèi)庫(kù)的特點(diǎn)是可以使用LINQ進(jìn)行查詢(xún)和操作,方便快捷。
相關(guān)文章
C# WinForm實(shí)現(xiàn)自動(dòng)更新程序的方法詳解
這一篇就著重寫(xiě)一下客戶(hù)端的代碼,客戶(hù)端主要實(shí)現(xiàn)的有:?jiǎn)?dòng)后檢測(cè)本地的xml文件,然后發(fā)送到服務(wù)器獲取需要更新的文件以及版本列表,感興趣的小伙伴可以了解一下2022-10-10
C#基于Socket的TCP通信實(shí)現(xiàn)聊天室案例
這篇文章主要為大家詳細(xì)介紹了C#基于Socket的TCP通信實(shí)現(xiàn)聊天室案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
c# 調(diào)用Win32Api關(guān)閉當(dāng)前應(yīng)用的方法
這篇文章主要介紹了c# 調(diào)用Win32Api關(guān)閉當(dāng)前應(yīng)用的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
C#調(diào)用VB進(jìn)行簡(jiǎn)繁轉(zhuǎn)換的方法
這篇文章主要介紹了C#調(diào)用VB進(jìn)行簡(jiǎn)繁轉(zhuǎn)換的方法,通過(guò)調(diào)用VB的動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)繁簡(jiǎn)轉(zhuǎn)換的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02

