Linq读取XML 中的节点信息

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

所以在这里开题说说。

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

有以下XML文件数据

<?xml version="1.0" encoding="utf-8"?>
<XTextDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" EditorVersionString="1.1.1820.30544">
   <Attributes />
   <XElements>
      <Element xsi:type="XTextBody" StyleIndex="0">
         <Expressions />
         <ScriptItems />
         <Attributes />
         <XElements>
            <Element xsi:type="XString">
               <Text>测试</Text>
            </Element>
            <Element xsi:type="XParagraphFlag" />
            <Element xsi:type="XTextTable" NumOfRows="3" NumOfColumns="3">
               <ID />
               <Expressions />
               <ScriptItems />
               <Attributes />
               <XElements>
                  <Element xsi:type="XTextTableRow">
                     <Expressions />
                     <ScriptItems />
                     <Attributes />
                     <XElements>
                        <Element xsi:type="XTextTableCell" StyleIndex="1">
                           <Expressions />
                           <ScriptItems />
                           <Attributes />
                           <XElements>
                              <Element xsi:type="XParagraphFlag" />
                           </XElements>
                        </Element>
                        <Element xsi:type="XTextTableCell" StyleIndex="1">
                           <Expressions />
                           <ScriptItems />
                           <Attributes />
                           <XElements>
                              <Element xsi:type="XParagraphFlag" />
                           </XElements>
                        </Element>
                        <Element xsi:type="XTextTableCell" StyleIndex="1">
                           <Expressions />
                           <ScriptItems />
                           <Attributes />
                           <XElements>
                              <Element xsi:type="XParagraphFlag" />
                           </XElements>
                        </Element>
                     </XElements>
                  </Element>
                  <Element xsi:type="XTextTableRow">
                     <Expressions />
                     <ScriptItems />
                     <Attributes />
                     <XElements>
                        <Element xsi:type="XTextTableCell" StyleIndex="1">
                           <Expressions />
                           <ScriptItems />
                           <Attributes />
                           <XElements>
                              <Element xsi:type="XParagraphFlag" />
                           </XElements>
                        </Element>
                        <Element xsi:type="XTextTableCell" StyleIndex="1">
                           <Expressions />
                           <ScriptItems />
                           <Attributes />
                           <XElements>
                              <Element xsi:type="XParagraphFlag" />
                           </XElements>
                        </Element>
                        <Element xsi:type="XTextTableCell" StyleIndex="1">
                           <Expressions />
                           <ScriptItems />
                           <Attributes />
                           <XElements>
                              <Element xsi:type="XParagraphFlag" />
                           </XElements>
                        </Element>
                     </XElements>
                  </Element>
                  <Element xsi:type="XTextTableRow">
                     <Expressions />
                     <ScriptItems />
                     <Attributes />
                     <XElements>
                        <Element xsi:type="XTextTableCell" StyleIndex="1">
                           <Expressions />
                           <ScriptItems />
                           <Attributes />
                           <XElements>
                              <Element xsi:type="XParagraphFlag" />
                           </XElements>
                        </Element>
                        <Element xsi:type="XTextTableCell" StyleIndex="1">
                           <Expressions />
                           <ScriptItems />
                           <Attributes />
                           <XElements>
                              <Element xsi:type="XParagraphFlag" />
                           </XElements>
                        </Element>
                        <Element xsi:type="XTextTableCell" StyleIndex="1">
                           <Expressions />
                           <ScriptItems />
                           <Attributes />
                           <XElements>
                              <Element xsi:type="XParagraphFlag" />
                           </XElements>
                        </Element>
                     </XElements>
                  </Element>
               </XElements>
               <Columns>
                  <Element xsi:type="XTextTableColumn">
                     <Width>624.9167</Width>
                  </Element>
                  <Element xsi:type="XTextTableColumn">
                     <Width>624.9167</Width>
                  </Element>
                  <Element xsi:type="XTextTableColumn">
                     <Width>624.9167</Width>
                  </Element>
               </Columns>
            </Element>
            <Element xsi:type="XInputField">
               <ID>001</ID>
               <Expressions />
               <ScriptItems />
               <Attributes />
               <XElements>
                  <Element xsi:type="XString">
                     <Text>这是测试1</Text>
                  </Element>
               </XElements>
               <SpecifyWidth>1181.10242</SpecifyWidth>
               <EventExpressions />
               <Name>测试一</Name>
               <ValueBinding>
                  <DataSource>Info</DataSource>
                  <BindingPath>测试一</BindingPath>
               </ValueBinding>
               <ValidateStyle />
               <InnerValue>这是测试1</InnerValue>
               <FieldSettings>
                  <ListSource>
                     <Items />
                  </ListSource>
               </FieldSettings>
            </Element>
            <Element xsi:type="XString">
               <Text>测试</Text>
            </Element>
            <Element xsi:type="XParagraphFlag" />
            <Element xsi:type="XInputField">
               <ID>002</ID>
               <Expressions />
               <ScriptItems />
               <Attributes />
               <XElements>
                  <Element xsi:type="XString">
                     <Text>这是测试2</Text>
                  </Element>
               </XElements>
               <Deleteable>false</Deleteable>
               <SpecifyWidth>590.5512</SpecifyWidth>
               <EventExpressions />
               <Name>测试2</Name>
               <ValueBinding>
                  <DataSource>Info</DataSource>
                  <BindingPath>测试2</BindingPath>
               </ValueBinding>
               <ValidateStyle />
               <InnerValue>这是测试2</InnerValue>
               <ToolTip>测试2</ToolTip>
               <FieldSettings>
                  <ListSource>
                     <Items />
                  </ListSource>
               </FieldSettings>
            </Element>
         </XElements>
      </Element>
      <Element xsi:type="XTextHeader" StyleIndex="0">
         <Expressions />
         <ScriptItems />
         <Attributes />
         <XElements />
      </Element>
      <Element xsi:type="XTextFooter" StyleIndex="0">
         <Expressions />
         <ScriptItems />
         <Attributes />
         <XElements />
      </Element>
   </XElements>
   <UserHistories />
   <Comments />
   <LocalConfig />
   <PageSettings />
</XTextDocument>

由于嵌套节点过多,再加上有<Element xsi:type="XTextBody" StyleIndex="0"> (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<LintToXml> lst = new List<LintToXml>();//可以放在lst里面
					LintToXml xx = new LintToXml();
					StringBuilder sb = new StringBuilder();//存放在字符里
					foreach (var item in getXML)
					{
						 //xx.Name = item.NodeName.Value; <code class="csharp plain"></code><code class="csharp comments">//第一次循环输出 测试一 第二次 测试二</code>
						 //xx.InnerValue = item.NodeValue.Value;<code class="csharp comments">//第一次循环输出 这是测试1 第二次 这是测试2</code>
						 sb.Append("Name" + item.NodeName.Value + ",
NodeValue" + item.NodeValue.Value+"<br/>");
					}
	public class LintToXml
          {
               public string Name { get; set; }
               public string InnerValue { get; set; }
          }

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

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

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

 IEnumerable<XElement> 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
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值