C#操做XML的方法有不少,但我的認爲最方便的莫過於Linq to XML了,特別是XElement的Descendants方法是我最經常使用的一個方法。測試
這個方法能夠根據節點名(Name)找到當前調用的XElement結點下全部的子XElement節點。最近,在寫一個程序時時,讓我有些新的發現。spa
示例XML文件:調試
1 <?xml version="1.0" encoding="utf-8"?> 2 <Activity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.test.com/test"> 3 <Name>1</Name> 4 <Activities> 5 <Activity> 6 <Name>2</Name> 7 </Activity> 8 <Activity> 9 <Name>3</Name> 10 </Activity> 11 </Activities> 12 </Activity>
這是一個關於Activity結點的樹形結構,每一個Activity節點都有一個Name子節點。我嘗試着使用下面的代碼,打印出全部Activity節點的Name子節點的值。code
1 var rootElement = XElement.Load("test.xml"); 2 var nameNodes = rootElement.Descendants("Name"); 3 4 foreach (var nameNode in nameNodes) 5 { 6 Console.WriteLine(nameNode.Value); 7 } 8 9 Console.ReadKey();
可是結果倒是空,當時很讓我吃驚,通過調試後,我才發現我略了一個地方。不知道你們注意沒有,測試的XML文件的根節點是有Namespace的,調用Descendants方法的時候,即便子節點沒有指定Namespace,也會被自動添加上,而XElement的Name屬性,偏偏是由Namespace和節點名共同組成的。找到緣由了,解決方法也就有了,只要作些小改動就好。xml
將代碼blog
1 var nameNodes = rootElement.Descendants("Name");
改爲utf-8
1 var nameNodes = rootElement.Descendants(rootElement.Name.Namespace + "Name");
便可。再次運行,即可打印出全部的Name節點值。it