使用c#检查xml文件中是否已存在XML节点值

时间:2014-01-15 21:01:06

标签: c# xml

请注意我是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");
}

然后弹出消息框始终。我做错了什么?

4 个答案:

答案 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