如何使用linq计算元素中的节点

how to count the node in elements with linq

我有 xml 看起来像这样:

<?xml version="1.0"?>
<planets>
  <planet number="1" diameter="3030 miles" year="88 earth days">
    <name>Mercury</name>
 </planet>
  <planet number="2" diameter="7516 miles" year="225 earth days">
    <name>Venus</name>
 </planet>
  <planet number="3" diameter="7926 miles" year="365 earth days">
   <name>Earth</name>
    <moons>
      <moon diameter="2160 miles">The Moon</moon>
    </moons>
  </planet>
 <planet number="4" diameter="4217 miles" year="687 earth days">
    <name>Mars</name>
     <moons>
      <moon diameter="17 miles">Phobos</moon>
      <moon diameter="9 miles">Deimos</moon>
    </moons>
 </planet>
</planets>

我尝试查询月亮的数量。

例如,对于火星,我想要 2 作为结果,然后我想将其与在文本框中输入的数字进行比较。

var text = Request.Params[0];

             XDocument xdoc = XDocument.Load(Server.MapPath("~/solar.xml"));
             XDocument xresp = new XDocument(new XElement("planets")); 

  if(text != null)
             {

                 IEnumerable<XElement> lune =
                     from b in xdoc.Elements("planets").Elements("planet")
                     where int.Parse(b.Element("moons").Count()) == int.Parse(text) 
                     select b;
                 foreach (XElement xEle in lune)
                     xresp.Element("planets").Add(xEle);
             }


             Response.Clear();
             Response.ContentType = "text/xml";
             Response.ContentEncoding = System.Text.Encoding.UTF8;
             xresp.Save(Response.Output); 
             Response.End();

您应该计算有多少 <moon> 个元素,而不是 <moons> 并计算它。但是您需要这样编写查询:

b.Elements("moons").Elements("moon").Count()

当 运行 查询有 0 个或多个结果时,您需要使用 Elements() 来确保返回一个集合。如果您使用 Element(),则返回所选元素或 null(如果不存在)。在您的情况下,并非每个行星都有 <moons> 元素。