如何用LINQ实现XML中MO元素name属性的精确匹配?
如何实现XML中MO元素name属性的精确匹配?
我明白你的困扰——用Contains方法做匹配时,只要目标字符串包含搜索子串就会命中,比如搜"1""10""100"都会匹配到name="xxxx-1000"的元素,这显然不是你要的精确匹配效果。下面给你几个可行的解决方案:
方案一:完全匹配整个name属性值
如果你的需求是整个name属性值和searchString完全相等,直接把Contains替换成相等判断即可,同时要注意处理属性不存在的情况避免空引用异常:
string searchString; var matches = doc.Root.Elements(ns + "MO") .Where(x => x.Attribute("name")?.Value == searchString);
这里的?.是空条件运算符,当name属性不存在时,x.Attribute("name")?.Value会返回null,不会抛出异常。
方案二:精确匹配name属性中-分隔后的后缀
从你的例子来看,name格式是前缀-数字,如果你的需求是匹配-后面的数字部分和searchString完全相等,可以先拆分属性值再判断:
string searchString; var matches = doc.Root.Elements(ns + "MO") .Where(x => x.Attribute("name") != null && x.Attribute("name").Value.Split('-').LastOrDefault() == searchString);
这样只有当-后面的部分(比如"1000")和searchString完全一致时才会命中,搜"1""10""100"都不会匹配到目标元素。
方案三:用正则表达式实现更灵活的精确匹配
如果你的name格式有变化,或者需要更复杂的匹配规则,可以用正则表达式来定义精确匹配的模式:
using System.Text.RegularExpressions; string searchString; // 匹配以任意字符开头,以"-"加searchString结尾的name值 var regex = new Regex($@"^.*-{Regex.Escape(searchString)}$"); var matches = doc.Root.Elements(ns + "MO") .Where(x => x.Attribute("name") != null && regex.IsMatch(x.Attribute("name").Value));
Regex.Escape的作用是转义searchString中的特殊正则字符,避免匹配逻辑出错。
不管用哪种方案,都记得要判断name属性是否存在,防止因为某些MO元素没有该属性而抛出空引用异常哦。
内容的提问来源于stack exchange,提问作者user4522534
相关产品推荐
相关产品推荐

