检查节点是否存在于XDocument

3

我有这个XML:

<Rejectedparameters>
  <parameter>
    <name>CO</name>
    <value>5.34</value>
  </parameter>
  <parameter>
    <name>CO2</name>
    <value>10.1</value>
  </parameter>
  <parameter>
    <name>HC</name>
    <value>473</value>
  </parameter>
  <parameter>
    <name>O2</name>
    <value>2</value>
  </parameter>
</Rejectedparameters>

我需要检查一个节点是否存在 - 就像这样:

  int Gvalue = (from x in document.Elements("Rejectedparameters").Elements("parameter")
                from p in x.Elements("Name")
                where x.Element("CO").Value.ToString() != string.Empty
                select x).Count();

但是 Gvalue 为什么是 0 - 为什么?如您所见,XML 中存在 CO 元素。

1
Namename 不是一样的 - XML 是区分大小写的。此外,您正在尝试查找一个名为 CO元素,但在您的文档中并不存在这样的元素。 - Jon Skeet
2个回答

11

首先,每个parameter元素只有一个名称,所以只需使用Element

接下来,使用name作为你要查找的元素,而不是Name

最后,你要查找的是CO的值,而不是名为CO的元素。因此,你将得到如下内容:

var query = doc
    .Root
    .Elements("parameter")
    .Where(parameter => (string) parameter.Element("name") == "CO" &&
                        !string.IsNullOrEmpty((string) parameter.Element("value"));
var count = query.Count(); // It's not clear why this was Gvalue in your original code

我猜你试图检查一个空字符串的情况,你可能不需要过滤器的第二部分。我假设你不仅想获取计数,而且实际上也想使用元素。

另一种方法是首先将所有参数转换为查询:

var parameters = doc.Root.Elements("parameter").Select(p =>
    new { Name = (string) p.Element("name"), Value = (string) p.Element("value") });
// Just as an example...
var co = parameters.SingleOrDefault(p => p.Name == "CO");

3
首先,CO不是元素,而是数值。您需要更改查询;
var gValue = document.Descendants("name").Count(x => x.Value == "CO");
Output : 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接