Linq检查子元素是否存在于父节点中 [英] Linq to check child element exist in parent node

查看:90
本文介绍了Linq检查子元素是否存在于父节点中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

<w:p w:rsidR="00DC605B" w:rsidP="00A60D85" w:rsidRDefault="009A6F33">
      <w:r>
        <w:rPr>
          <w:bCs />
          <w:sz w:val="24" />
          <w:szCs w:val="24" />
        </w:rPr>
        <w:t>Flow rate</w:t>
      </w:r>
      <w:r>
        <w:rPr>
          <w:bCs />
          <w:sz w:val="24" />
          <w:szCs w:val="24" />
        </w:rPr>
        <w:tab />
      </w:r>
      <w:r>
        <w:rPr>
          <w:bCs />
          <w:sz w:val="24" />
          <w:szCs w:val="24" />
        </w:rPr>
        <w:tab />
        <w:t xml:space="preserve">: 0.8 </w:t>
      </w:r>
      <w:r>
        <w:rPr>
          <w:bCs />
          <w:color w:val="000000" />
          <w:sz w:val="24" />
          <w:szCs w:val="24" />
        </w:rPr>
        <w:t>ml/min</w:t>
      </w:r>
    </w:p>







i want to check whether  both 
        w:tab
        w:t xml:space="preserve">: 0.8 w:t
tags exist in  <w:r>





我尝试过:



i尝试过多次linq查询但没有成功



What I have tried:

i have tried many linq queries but not succeeded

推荐答案

因为你没有说明你想如何使用结果,我刚创建了一个布尔列表

As you don't state how you want to use the result, I just created a list of booleans
XNamespace xns = "http://www.somesite.com/";
XDocument xdInput = XDocument.Load(@"C:\Temp\input.xml");
XElement xeWP = xdInput.Root.Element(xns + "p");

var existList = from el in xeWP.Elements(xns + "r")
        select (el.Element(xns + "tab") != null && el.Element(xns + "t") != null);



为了使它工作我将XML数据包含在新的根元素中


To make it work I enclosed your XML data in a new root element

<root xmlns:w="http://www.somesite.com/">
    <w:p w:rsidR="00DC605B" w:rsidP="00A60D85" w:rsidRDefault="009A6F33">
        ...
    </w:p>
</root>





这个片段只打印出结果:



This snippet just prints out the result:

for (int i = 0; i < existList.Count(); i++)
    Console.WriteLine("Item {0} : {1}", i + 1, existList.ElementAt(i));


如果必须使用 LINQ (虽然使用 System.IO.File.ReadAllLines 会更容易)

If you must use LINQ (although this would be easier with System.IO.File.ReadAllLines)
//Load xml
XDocument xdoc = XDocument.Load("LinqTest1.xml");

//Run query
var lv1s = from lv1 in xdoc.Descendants("tab")
           select new
           {
               val = lv1.Value
           };

foreach (var lv1 in lv1s)
{
    Debug.Print(lv1.val);
}





此代码不适用于您的xml,请查看有关命名空间的信息:

如何:控制命名空间前缀(C#)(LINQ to XML) [ ^ ]

我只是通过重新格式化你的xml来实现它:



< p>

< r>

< rPr>

< bCs />

< sz val =24 />

< szCs val =24/>

< / rPr>

< t>流量< ; / t>

< / r>

< r>

< rPr>

< ; bCs />

< sz val =24/>

< szCs val =24/>

< / rPr>

< tab />

< / r>

< r>

< rPr>

< bCs />

< sz val =24/>

< szCs val =24/>

< / rPr>

< tab />

< t val =0.8/>

< / r>

< r>

< rPr> ;

< bCs />

< color val =000000/>

< sz val =24 />

< szCs val =24/>

< / rPr>

< t> ml / min< ; / t>

< / r>

< / p>



This code won't work with your xml, take a look here for information about namespaces:
How to: Control Namespace Prefixes (C#) (LINQ to XML)[^]
I only got it working by reformatting your xml like this:

<p>
<r>
<rPr>
<bCs />
<sz val="24" />
<szCs val="24" />
</rPr>
<t>Flow rate</t>
</r>
<r>
<rPr>
<bCs />
<sz val="24" />
<szCs val="24" />
</rPr>
<tab />
</r>
<r>
<rPr>
<bCs />
<sz val="24" />
<szCs val="24" />
</rPr>
<tab />
<t val="0.8" />
</r>
<r>
<rPr>
<bCs />
<color val="000000" />
<sz val="24" />
<szCs val="24" />
</rPr>
<t>ml/min</t>
</r>
</p>


这篇关于Linq检查子元素是否存在于父节点中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆