C#查找含特定子元素的元素时仅返回首个匹配组的问题
问题分析与解决方案
嘿,我一眼就揪出你代码里的问题啦!
问题根源
你在where子句里用了el.Element("ip"),这个方法的作用是只获取当前<group>节点下的第一个<ip>子元素。所以哪怕某个<group>里后面的<ip>值和文本框输入匹配,这个条件也会直接忽略它——就像你看到的,只有第一个<group>(name="a")的第一个<ip>是10.3.4,能匹配上;第二个<group>(name="b")的第一个<ip>是10.2.1,和输入值不匹配,所以被过滤掉了,哪怕它里面确实有10.3.4这个IP。
修复后的代码
你需要检查当前<group>下的所有<ip>元素,只要其中有一个和输入值匹配,就选中这个<group>。可以用Elements("ip")获取所有IP子元素,再配合Any()方法实现这个逻辑:
XElement root = XElement.Load("c:\\etc"); IEnumerable<XElement> tests = from el in root.Elements("group") // 检查当前group下是否有任意一个ip元素的值等于输入文本 where el.Elements("ip").Any(ip => (string)ip == textBox1.Text) select el; foreach (XElement el in tests) Console.WriteLine((string)el.Attribute("name"));
验证效果
当你在文本框输入10.3.4时,这段代码会同时输出a和b,因为两个<group>里都包含这个IP;输入10.55.55时,只会输出b,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

