检查节点是否存在于XDocument中

Ehs*_*bar 1 c# xml

我有这个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>
Run Code Online (Sandbox Code Playgroud)

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

  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();
Run Code Online (Sandbox Code Playgroud)

但是Gvalue是0 - 为什么?如您所见,CO它存在于XML中.

Jon*_*eet 9

首先,每个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
Run Code Online (Sandbox Code Playgroud)

我已经猜到你要检查空字符串了什么...你可能不需要过滤器的第二部分.我假设你不仅想得到计数 - 你实际上也想要使用这些元素.

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

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");
Run Code Online (Sandbox Code Playgroud)