C# WinForm如何检测XML文件中aircraft_name是否重复?
C# WinForm 检测XML中aircraft_name唯一性问题
我正在开发一个C# WinForm程序,需要向第三方XML文件添加aircraft_info节点,要求aircraft_name必须唯一。计划获取用户输入名称后检测是否存在,若存在则提示更换,但尝试三种方法均失败,希望实现首次检测到重复时返回bool值的方案。
尝试过的代码:
方法一(XDocument 错误用法):
XDocument doc = XDocument.Load("compliance_data.xml"); XElement root = new XElement("aircraft_info"); var matches = root .Descendants("aircraft_info") .Where(ft => ((string)ft.Element("aircraft_name")) == "Default");
问题:错误地新建空
aircraft_info节点查找后代,而非从加载的XML文档中查询。
方法二(XDocument 未判断存在性):
XDocument doc = XDocument.Load("compliance_data.xml"); var matches = doc .Descendants("aircraft_info") .Where(ft => ((string)ft.Element("aircraft_name")) == "Default");
问题:仅获取匹配集合,未判断是否存在,也未返回bool值。
方法三(XmlDocument XPath 语法问题):
XmlDocument doc = new XmlDocument(); doc.Load(@"compliance_data.xml"); foreach (XmlNode node in doc.SelectNodes("//aircraft_info[aircraft_name == \"Default\"]/aircraft_name")) { MsgBox.Show(node.InnerText, "abc", MessageBoxButtons.OK, MessageBoxIcon.None); //自定义消息框 }
问题:XPath字符串比较语法错误,且未直接返回bool值,而是遍历所有匹配项。
正确实现方案:
方案1:使用LINQ to XML(XDocument)
利用Any()方法,找到第一个匹配项立即返回true,满足"首次检测到重复就返回"的需求:
public bool IsAircraftNameExists(string inputName) { XDocument doc = XDocument.Load("compliance_data.xml"); return doc.Descendants("aircraft_info") .Any(ft => (string)ft.Element("aircraft_name") == inputName); }
调用示例:
string userInput = "用户输入的名称"; if (IsAircraftNameExists(userInput)) { MsgBox.Show("该飞机名称已存在,请更换", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { // 执行添加aircraft_info节点的逻辑 }
方案2:使用XmlDocument
修正XPath语法,用SelectSingleNode直接判断是否存在匹配项:
public bool IsAircraftNameExists(string inputName) { XmlDocument doc = new XmlDocument(); doc.Load(@"compliance_data.xml"); // 用单引号包裹字符串避免转义问题,若输入含单引号需替换为'' string xpath = $"//aircraft_info[aircraft_name='{inputName.Replace("'", "''")}']"; return doc.SelectSingleNode(xpath) != null; }
调用示例同上。
内容的提问来源于stack exchange,提问作者user3884423
相关产品推荐
相关产品推荐

