LINQ到XML问题
我在这里的要求是检索与主机名匹配的节点(例如machine1),并且我总是不会返回任何结果。请告诉我问题出在哪里 提前谢谢你的帮助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)
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”)。