Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ到XML问题_Linq - Fatal编程技术网

LINQ到XML问题

LINQ到XML问题,linq,Linq,我在这里的要求是检索与主机名匹配的节点(例如machine1),并且我总是不会返回任何结果。请告诉我问题出在哪里 提前谢谢你的帮助 XDocument configXML = XDocument.Load("the below xml"); var q = from s in configXML.Descendants("lcsetting") where ((string)s.Element("host") == hostName)

我在这里的要求是检索与主机名匹配的节点(例如machine1),并且我总是不会返回任何结果。请告诉我问题出在哪里

提前谢谢你的帮助

XDocument configXML = XDocument.Load("the below xml");

var q = from s in configXML.Descendants("lcsetting")
    where ((string)s.Element("host") == hostName)                        
    select s;
实际的xml:

<lcsettings>
  <lcsetting env="prod">
    <hosts usagelogpath="">
      <host>machine1</host>
      <host>machine2</host>
      <host>machine3</host>
    </hosts>
  </lcsetting>
  <lcsetting env="qa">
    <hosts usagelogpath="">
      <host>machine4</host>
      <host>machine5</host>
      <host>machine6</host>
    </hosts>
  </lcsetting>
  <lcsetting env="test">
    <hosts usagelogpath="">
      <host>machine7</host>
      <host>machine8</host>
      <host>machine9</host>
    </hosts>
  </lcsetting>
</lcsettings>

机器1
机器2
机器3
机器4
机器5
机器6
机器7
机器8
机器

您正在lcsetting下直接查找一个
主机
元素-这不会发生,因为层次结构中两个主机之间总是有一个
主机
元素。您还使用了
Element
而不是
Elements
,这意味着只返回具有正确名称的第一个元素

您可以再次使用
子体
,而不是
元素
。。。但你需要改变条件。比如:

var q = from s in configXML.Descendants("lcsetting")
        where s.Descendants("host").Any(host => host.Value == hostName)
        select s;
或者,您可以让查询查找
host
元素,然后在每种情况下使用祖父母元素:

var q = from host in configXML.Descendants("host")
        where host.Value == hostName
        select host.Parent.Parent;

(这假设主机元素在每个
lcsetting
中只出现一次;如果不是这样,您可以添加对
Distinct
的调用)

“主机”不是“lcsetting”的子元素。

这是因为您的lcsetting正下方有一个包含您的标记的标记。他不是一个天生的孩子

此查询将用于:

var q = from s in configXML.Descendants("lcsetting").SelectMany(lcSetting => lcSetting.Descendants("host"))
        where s.Name == "host" && s.Value == hostName
        select s;

您正在选择该设置,但随后尝试检查元素主体,该主体位于其下方两个级别。函数的作用是:只引用1级深度的子元素。我建议将此更改为:

XDocument configXML = XDocument.Load("the below xml");
var q = from s in configXML.Descendants("lcsetting") 
        where s.Descendants("host").SingleOrDefault(e => e.Value == hostname) != null
        select s;

谢谢你的回复。另外,如果查询没有返回任何结果,是否可以检索默认的lcsetting元素(比如“qa”)。