Linq读取XML 中的节点信息

刚在CSDN上回答了一个问题,感觉蛮有代表性。原文地址:http://bbs.csdn.net/topics/390798406?page=1#post-397486465

所以在这里开题说说。

问题是分别想取下面数据
测试1中的这是测试1的值并放在一个TEXTBOX1中,
测试2中的这是测试2的值并放在一个TEXTBOX2中
应该如何一次搞定呢?

有以下XML文件数据



   
   
      
         
         
         
         
            
               测试
            
            
            
               
               
               
               
               
                  
                     
                     
                     
                     
                        
                           
                           
                           
                           
                              
                           
                        
                        
                           
                           
                           
                           
                              
                           
                        
                        
                           
                           
                           
                           
                              
                           
                        
                     
                  
                  
                     
                     
                     
                     
                        
                           
                           
                           
                           
                              
                           
                        
                        
                           
                           
                           
                           
                              
                           
                        
                        
                           
                           
                           
                           
                              
                           
                        
                     
                  
                  
                     
                     
                     
                     
                        
                           
                           
                           
                           
                              
                           
                        
                        
                           
                           
                           
                           
                              
                           
                        
                        
                           
                           
                           
                           
                              
                           
                        
                     
                  
               
               
                  
                     624.9167
                  
                  
                     624.9167
                  
                  
                     624.9167
                  
               
            
            
               001
               
               
               
               
                  
                     这是测试1
                  
               
               1181.10242
               
               测试一
               
                  Info
                  测试一
               
               
               这是测试1
               
                  
                     
                  
               
            
            
               测试
            
            
            
               002
               
               
               
               
                  
                     这是测试2
                  
               
               false
               590.5512
               
               测试2
               
                  Info
                  测试2
               
               
               这是测试2
               测试2
               
                  
                     
                  
               
            
         
      
      
         
         
         
         
      
      
         
         
         
         
      
   
   
   
   
   

由于嵌套节点过多,再加上有 (BTW:节点的命名空间的,还可以通过别名来指定。)这样的节点信息,一般情况下用Xpath只要用Descendants,或者Element查找根下的所有节点,再用Attribute排除掉不想要的就可以了。

对于这样有namespace的XML,就必须在代码里指定要查询节点的Namespace。


代码:

 XElement xmlDoc = XElement.Load(@"../../XMLFile1.xml");
			   XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
			   var getXML = from p in xmlDoc.Descendants("XElements").Descendants("Element").
Descendants("XElements").Descendants("Element")
							where p.Attribute(xsi + "type").Value == "XInputField"
							select new
							{
								 NodeName = p.Element("Name"),
								 NodeValue = p.Element("InnerValue")
							};
					 List lst = new List();//可以放在lst里面
					LintToXml xx = new LintToXml();
					StringBuilder sb = new StringBuilder();//存放在字符里
					foreach (var item in getXML)
					{
						 //xx.Name = item.NodeName.Value; //第一次循环输出 测试一 第二次 测试二
						 //xx.InnerValue = item.NodeValue.Value;//第一次循环输出 这是测试1 第二次 这是测试2
						 sb.Append("Name" + item.NodeName.Value + ",
NodeValue" + item.NodeValue.Value+"
"); } public class LintToXml           {                public string Name { get; set; }                public string InnerValue { get; set; }           }

其实上面也可以使用序列化,反序列化的来实现,。但是由于这个XML嵌套的节点过深,么有实现

参考序列化,反序列化文章:http://kb.cnblogs.com/page/177101/

还可以用IEnumerable接口来获取所有元素

 IEnumerable elementCollection = from p in xmlDoc.Descendants("XElements").Descendants("Element").
Descendants("XElements").Descendants("Element")
				 where p.Attribute(xsi + "type").Value == "XInputField" select p;
			   var test = from p in elementCollection
						  select new
							   {
									NodeName = p.Element("Name"),
									NodeValue = p.Element("InnerValue")
							   };
			   foreach(var item in test)
			   {
					var ss=item.NodeValue;
					var dd=item.NodeName;
			   }

资料参考:http://blog.csdn.net/duanzi_peng/article/details/24018431


XElement.Descendants 方法  http://msdn.microsoft.com/zh-tw/library/system.xml.linq.xelement.descendants

XElement.Elements 方法  http://msdn.microsoft.com/zh-tw/library/system.xml.linq.xelement.elements%28v=vs.110%29.aspx
 


你可能感兴趣的:(.NET,And,C#,LINQ,And,SQL,Server)