C#基礎系列:Linq to Xml讀寫xml

發表於2016-02-28

前言:xml的操作方式有多種,但要論使用頻繁程度,博主用得最多的還是Linq to xml的方式,覺得它使用起來很方便,就用那麼幾個方法就能完成簡單xml的讀寫。之前做的一個專案有一個很變態的需求:C#專案呼叫不知道是什麼語言寫的一個WebService,然後新增服務引用總是失敗,通過代理的方式動態呼叫也總是報錯,最後沒辦法,通過傳送原始的WebRequest請求直接得到對方返回的一個xml檔案。注意過webservice的wsdl檔案的朋友應該知道這個是系統生成的xml檔案,有點複雜,研究了半天終於能正常讀寫了。今天在這裡和大家分享下。

1、介紹之前,首先回顧下Linq to xml的方式讀寫簡單xml的方法

(1)讀取xml

(2)寫xml

通過XDocument、XElement物件和Element()、Elements()兩個方法能完成大部分xml檔案的操作。

2、進入今天的正題:讀寫帶名稱空間的xml檔案。

首先來看一段xml

第一次看到這個檔案確實讓人萌神了,比如需要取一個msdata:IsDataSet=”true”這個屬性,該怎麼取…

解析之前,先來分析下這段xml,<DataSet xmlns=”http://WebXml.com.cn/”>這段裡面有一個xmlns屬性,這個屬性是每一個標籤自帶的屬性,不信你可以新建一個xml檔案,然後在任何一個標籤裡面輸入xmlns屬性,後面都會出來很多的系統自帶的名稱空間。這個屬性表示所屬標籤在哪個名稱空間下面,所以在取的時候要帶上這個名稱空間。

先來看看解析的程式碼:

我們來解析下幾個關鍵的地方:

(1)我們來解析下

這一句,最前面的”xs”表示標籤所屬名稱空間的變數,xmlns:xs=”http://www.w3.org/2001/XMLSchema”這個表示xs這個名稱空間的值。所以要得到schema這個標籤需要帶上名稱空間var oSchema = oDataSet.Element(XName.Get(“schema”, “http://www.w3.org/2001/XMLSchema”));這個標籤還定義了另一個名稱空間xmlns:msdata=”urn:schemas-microsoft-com:xml-msdata”。

(2)再來看看aa標籤

msdata就是上面schema標籤裡面定義的另一個名稱空間,表示aa標籤屬於msdata名稱空間下面。

(3)再看來看屬性的取法:

如果要取msdata:IsDataSet=”true”,由於這個屬性也帶有名稱空間,所以取屬性時也要加上名稱空間了。所以需要這樣取。

var oElementValue = oElement.Attribute(XName.Get(“IsDataSet”, “urn:schemas-microsoft-com:xml-msdata”));

現在大夥們應該對這種xml有一個更加清晰的認識了吧。其實一般情況下這種場景比較少見,因為這麼複雜的xml一般是由引用服務時代理物件去解析的。但如果真的有這麼變態的需求我們也不用擔心了。在此記錄下,以後如果大家遇到希望能節約大夥的時間。

本系列:

相關文章