ASP.NET中从XML文件统计数量大于10的采购记录数的实现问题求助
解决XmlDocument筛选quantity>10的采购记录并统计数量的问题
你遇到的「Expression must evaluate to node error」错误,核心是XPath表达式语法错误,再加上你误用了SelectSingleNode(只能返回单个节点)而非批量筛选的SelectNodes,导致逻辑走不通。我给你修正一下代码,非常简洁直接:
修正后的XmlDocument实现代码
using System.Xml; using System; using System.IO; // 注意你原来的变量名FILENAME1和FILENAME不一致,这里统一修正 const string FILENAME = "GoodXML.xml"; string file1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, FILENAME); XmlDocument doc = new XmlDocument(); doc.Load(file1); // 修正XPath语法:去掉Purchase后面的多余斜杠,将筛选条件直接写在节点的方括号内 XmlNodeList matchingPurchases = doc.SelectNodes("/PurchaseCollection/purchases/Purchase[quantity>10]"); // 直接统计符合条件的节点数量,赋值给Label Label1.Text = $"符合条件的采购记录总数:{matchingPurchases.Count}";
错误点说明
- XPath语法错误:你原来的
/PurchaseCollection/purchases/Purchase/[quantity>10]多了一个斜杠,正确写法是Purchase[quantity>10]——方括号直接跟在要筛选的节点(Purchase)后面,用来指定筛选条件。 - 选错了方法:
SelectSingleNode只会返回第一个匹配的节点,而你需要统计所有符合条件的记录,所以要用SelectNodes返回节点列表,再取它的Count属性。 - 变量名不一致:你定义了
FILENAME1但后面用了FILENAME,这会导致编译错误,我已经统一修正。
可选:更简洁的LINQ to XML写法
如果你愿意尝试更现代的写法,LINQ to XML会更直观,代码量更少:
using System.Xml.Linq; XDocument xDoc = XDocument.Load(file1); int count = xDoc.Descendants("Purchase") .Where(p => (int)p.Element("quantity") > 10) .Count(); Label1.Text = $"符合条件的采购记录总数:{count}";
这个写法不需要写复杂的XPath,直接用LINQ表达式筛选,可读性更高。
内容的提问来源于stack exchange,提问作者Artiems
相关产品推荐
相关产品推荐

