2012-03-13 69 views
0

检索节点计数xml基于条件我无法检索具有以下属性的节点的正确计数:IsTrue =“true”my xml。我使用根据条件使用linq

代码是:>>>

 Array depCnfg = (from node in xml.Descendants(Qualities).Descendants() 
          where node.Parent.Name == Qualities && 
          (node.Attribute(ISTRUE).Value.ToString().ToLower() == "true") 
          select { 
          totalCount = node.Nodes().Count()}).ToArray(); 

XML USED: >>> 

<Qualities> 
<General> 
    <Tag1 IsTrue = "true"> 
     <SubTag1>0</SubTag1> 
    </Tag1>  
    <Tag2 IsTrue = "false"> 
     <SubTag2>0</SubTag2> 
    </Tag2> 
</General> 
</Qualities> 

在这里,我总是得到数为2,但实际上它应该是1 如果任何人有一个想法,请分享...谢谢

+0

是depCnfg.Count == 2还是defCnfg [0] .totalCount == 2? – Rich 2012-03-13 18:02:31

+0

@Rich:'select'中的totalCount值为2;即在xml文件中都读取,这是不正确的。我尝试在Count()内使用lambda表达式,但它不起作用。 – spins3 2012-03-13 18:55:36

+0

您仍然用'node.Nodes()'计数所有节点,而不是'IsTrue ==“true”'的节点。 – 2012-03-14 12:34:17

回答

1

您可以使用以下LINQ查询来计算。这是抓住'质量'节点并将其放入它自己的元素。然后我们看每一个后代,并检查以下内容:

  1. 是否包含属性
  2. 是否含有添加名为“IsTrue运算”
  3. 请问“IsTrue运算”属性的值等于“真”

然后它获得满足该条件的元素的数量。这假设只有一个'质量'节点。在这种情况下,您将不得不使用XElement qualities = element.Element * s *(“Qualities”); 。

string sampleString = "<MAINROOT>" + 
         "<Qualities>" + 
         "<General>" + 
          "<Tag1 IsTrue = \"true\">" + 
           "<SubTag1>0</SubTag1>" + 
          "</Tag1>" + 
          "<Tag2 IsTrue = \"false\">" + 
           "<SubTag2>0</SubTag2>" + 
          "</Tag2>" + 
         "</General>" + 
         "</Qualities>" + 
        "</MAINROOT>"; 
     XElement element = XElement.Parse(sampleString); 
     XElement qualities = element.Element("Qualities"); 
     if (qualities != null) 
     { 
      int trueCount = element.Element("Qualities") 
      .Descendants() 
      .Where(x => x.HasAttributes && x.Attribute("IsTrue") != null && x.Attribute("IsTrue").Value == "true") 
      .Count(); 
     } 
+0

谢谢克里斯。这工作。 – spins3 2012-08-25 14:36:02

+0

我很高兴!如果你发现这有帮助,你会考虑选择答案作为接受的答案,并提高我的反应?这将结束这个问题,并给我一些功劳。 – 2012-08-25 18:14:14