天天看點

Linq to Xml讀取複雜xml(帶命名空間)

前言: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一般是由引用服務時代理對象去解析的。但如果真的有這麼變态的需求我們也不用擔心了。在此記錄下,以後如果大家遇到希望能節約大夥的時間。

xml