Linq to XML 之XElement的Descendants方法的新發現


C#操作XML的方法有很多,但個人認為最方便的莫過於Linq to XML了,特別是XElement的Descendants方法是我最常用的一個方法。

這個方法可以根據節點名(Name)找到當前調用的XElement結點下所有的子XElement節點。最近,在寫一個程序時時,讓我有些新的發現。

示例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子節點的值。

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和節點名共同組成的。找到原因了,解決方法也就有了,只要做些小改動就好。

將代碼

1 var nameNodes = rootElement.Descendants("Name");

改成

1 var nameNodes = rootElement.Descendants(rootElement.Name.Namespace + "Name");

即可。再次運行,便可打印出所有的Name節點值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM