请注意我是C#的新手,我现在就学会了:)我找不到与我的问题类似的东西,所以我来到这里。
我有一个应用程序,我在其中添加客户(它在最后阶段)。所有客户都存储在XML文件中。每个客户都会获得一个新的客户编号。在我的xml文件中,我得到一个名为XmlNode
的{{1}}。现在,如果用户添加新客户并键入已存在的号码,则应弹出一个消息框,表示该号码已存在。我得到了这个c#代码:
CustNo
我的XML文件如下所示:
XDocument xdoc = XDocument.Load(path + "\\save.xml");
var xmlNodeExist = String.Format("Buchhaltung/Customers/CustNo");
var CustNoExist = xdoc.XPathSelectElement(xmlNodeExist);
if (CustNoExist != null)
{
MessageBox.Show("asdf");
}
然后弹出消息框始终。我做错了什么?
答案 0 :(得分:4)
那是因为你的XPath会返回所有CustNo
元素,无论它是什么内容。
请尝试以下操作:
var myNumber = 12;
var xmlNodeExist = String.Format("Buchhaltung/Customers/CustNo[. = {0}]", myNumber.ToString());
或使用First
和LINQ to XML:
var myNumber = 12;
var xmlNodeExist = "Buchhaltung/Customers/CustNo";
var CustNoExist = xdoc.XPathSelectElements(xmlNodeExist).FirstOrDefault(x => (int)x == myNumber);
答案 1 :(得分:1)
您目前正在测试是否存在任何“CustNo”元素。有关XPath语法,请参阅this reference。
你的XPath应该这样说:
Buchhaltung//Customers[CustNo='12']
会说“任何包含'CustNo'元素的客户元素,其值为'12'”
将其与您当前的代码结合使用:
var custNoGivenByCustomer = "12";
var xmlNodeExistsXpath = String.Format("Buchhaltung//Customers[CustNo='{0}']", custNoGivenByCustomer );
var CustNoExist = xdoc.XPathSelectElement(xmlNodeExistsXpath);
答案 2 :(得分:1)
您可以使用LINQ to XML
var number = textBox1.Text;
var CustNoExist = xdoc.Descendants("CustNo").Any(x => (string)x == number);
if(CustNoExist)
{
MessageBox.Show("asdf");
}
答案 3 :(得分:0)
这是因为您选择了CustNo
元素,无论它们的值如何。这会将其过滤到所需的客户编号:
int custNo = 12;
var xmlNodeExist = String.Format("Buchhaltung/Customers[CustNo={0}]", custNo);
它会选择Customers
元素,但由于您只是检查存在,这是不重要的。
W3Schools有一个很好的tutorial/reference on XPath。