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

C# 使用c检查XML文件中是否已经存在XML节点值#,c#,xml,C#,Xml,请注意,我是C#的新手,我现在正在学习:)我找不到类似于我的问题的东西,所以我来到这里 我有一个应用程序,我在其中添加客户(它处于最后阶段)。所有客户都存储在一个XML文件中。每个客户都会得到一个新的客户编号。在我的xml文件中,我得到了一个名为CustNo的XmlNode。现在,如果用户添加了一个新客户并输入了一个已经存在的号码,它应该会弹出一个消息框,说明这个号码已经存在。我得到了这个c代码: 我的XML文件如下所示: <Buchhaltung> <Customer

请注意,我是C#的新手,我现在正在学习:)我找不到类似于我的问题的东西,所以我来到这里

我有一个应用程序,我在其中添加客户(它处于最后阶段)。所有客户都存储在一个XML文件中。每个客户都会得到一个新的客户编号。在我的xml文件中,我得到了一个名为
CustNo
XmlNode
。现在,如果用户添加了一个新客户并输入了一个已经存在的号码,它应该会弹出一个消息框,说明这个号码已经存在。我得到了这个c代码:

我的XML文件如下所示:

<Buchhaltung>
    <Customers>
        <CustNo>12</CustNo>
        <Surname>Random</Surname>
        <Forename>Name</Forename>
        <Addr>Address</Addr>
        <Zip>12345</Zip>
        <Place>New York</Place>
        <Phone>1234567890</Phone>
        <Mail>example@test.com</Mail>
    </Customers>
    <Customers>
        <CustNo>13</CustNo>
        <Surname>Other</Surname>
        <Forename>Forename</Forename>
        <Addr>My Address</Addr>
        <Zip>67890</Zip>
        <Place>Manhattan</Place>
        <Phone>0987654321</Phone>
        <Mail>test@example.com</Mail>
    </Customers>
</Buchhaltung>

12
随机的
名称
地址
12345
纽约
1234567890
example@test.com
13
其他
名字
我的地址
67890
曼哈顿
0987654321
test@example.com

但是消息框总是会弹出。我做错了什么?

您当前正在测试是否存在任何“CustNo”元素。有关XPath语法,请参见

您的XPath应该这样说:

<Buchhaltung>
    <Customers>
        <CustNo>12</CustNo>
        <Surname>Random</Surname>
        <Forename>Name</Forename>
        <Addr>Address</Addr>
        <Zip>12345</Zip>
        <Place>New York</Place>
        <Phone>1234567890</Phone>
        <Mail>example@test.com</Mail>
    </Customers>
    <Customers>
        <CustNo>13</CustNo>
        <Surname>Other</Surname>
        <Forename>Forename</Forename>
        <Addr>My Address</Addr>
        <Zip>67890</Zip>
        <Place>Manhattan</Place>
        <Phone>0987654321</Phone>
        <Mail>test@example.com</Mail>
    </Customers>
</Buchhaltung>
Buchhaltung//客户[CustNo='12']

它会说“任何包含值为'12'的'CustNo'元素的customers元素”

结合您当前的代码:

var custNoGivenByCustomer = "12";
var xmlNodeExistsXpath = String.Format("Buchhaltung//Customers[CustNo='{0}']", custNoGivenByCustomer );
var CustNoExist = xdoc.XPathSelectElement(xmlNodeExistsXpath);

您当前正在测试是否存在任何“CustNo”元素。有关XPath语法,请参见

您的XPath应该这样说:

<Buchhaltung>
    <Customers>
        <CustNo>12</CustNo>
        <Surname>Random</Surname>
        <Forename>Name</Forename>
        <Addr>Address</Addr>
        <Zip>12345</Zip>
        <Place>New York</Place>
        <Phone>1234567890</Phone>
        <Mail>example@test.com</Mail>
    </Customers>
    <Customers>
        <CustNo>13</CustNo>
        <Surname>Other</Surname>
        <Forename>Forename</Forename>
        <Addr>My Address</Addr>
        <Zip>67890</Zip>
        <Place>Manhattan</Place>
        <Phone>0987654321</Phone>
        <Mail>test@example.com</Mail>
    </Customers>
</Buchhaltung>
Buchhaltung//客户[CustNo='12']

它会说“任何包含值为'12'的'CustNo'元素的customers元素”

结合您当前的代码:

var custNoGivenByCustomer = "12";
var xmlNodeExistsXpath = String.Format("Buchhaltung//Customers[CustNo='{0}']", custNoGivenByCustomer );
var CustNoExist = xdoc.XPathSelectElement(xmlNodeExistsXpath);

这是因为XPath返回所有
CustNo
元素,无论其内容如何

请尝试以下操作:

var myNumber = 12;
var xmlNodeExist = String.Format("Buchhaltung/Customers/CustNo[. = {0}]", myNumber.ToString());
或者首先使用
和LINQ to XML:

var myNumber = 12;
var xmlNodeExist = "Buchhaltung/Customers/CustNo";
var CustNoExist = xdoc.XPathSelectElements(xmlNodeExist).FirstOrDefault(x => (int)x == myNumber);

这是因为XPath返回所有
CustNo
元素,无论其内容如何

请尝试以下操作:

var myNumber = 12;
var xmlNodeExist = String.Format("Buchhaltung/Customers/CustNo[. = {0}]", myNumber.ToString());
或者首先使用
和LINQ to XML:

var myNumber = 12;
var xmlNodeExist = "Buchhaltung/Customers/CustNo";
var CustNoExist = xdoc.XPathSelectElements(xmlNodeExist).FirstOrDefault(x => (int)x == myNumber);

您可以使用LINQ转换XML

var number = textBox1.Text;
var CustNoExist = xdoc.Descendants("CustNo").Any(x => (string)x == number);
if(CustNoExist)
{
  MessageBox.Show("asdf");
}

您可以使用LINQ转换XML

var number = textBox1.Text;
var CustNoExist = xdoc.Descendants("CustNo").Any(x => (string)x == number);
if(CustNoExist)
{
  MessageBox.Show("asdf");
}

这是因为您选择了
CustNo
元素,而不考虑它们的值。这将过滤到所需的客户编号:

int custNo = 12;
var xmlNodeExist = String.Format("Buchhaltung/Customers[CustNo={0}]", custNo);
它会选择
Customers
元素,但由于您只是检查是否存在,这并不重要


W3Schools有一个很好的属性。

这是因为您选择了
CustNo
元素,而不管它们的值如何。这将过滤到所需的客户编号:

int custNo = 12;
var xmlNodeExist = String.Format("Buchhaltung/Customers[CustNo={0}]", custNo);
它会选择
Customers
元素,但由于您只是检查是否存在,这并不重要



W3Schools有一个很好的解决方案。

如果我只得到“12”作为节点值,这个解决方案就可以工作,对吗?如果我的数字达到100呢?然后我必须检查这些是否已经存在。如果我只得到“12”作为节点值,这个解决方案是有效的,对吗?如果我的数字达到100呢?然后我必须检查这些是否已经存在。谢谢你的回答。我想这可能需要一点修正<代码>我的号码现在是“12”。所以应用程序检查是否有一个值为12的客户编号,对吗?那么“13”的值呢?还是“14”及更多?如何检查这些?我想我可以使用
.innerText
。这可能吗?如果是,您能给我一个提示吗?只需更改
myNumber
变量值,将用户键入的号码作为新的客户号码。您是指文本框值?
int myNumber=int.Parse(yourString)谢谢你的回答。我想这可能需要一点修正<代码>我的号码现在是“12”。所以应用程序检查是否有一个值为12的客户编号,对吗?那么“13”的值呢?还是“14”及更多?如何检查这些?我想我可以使用
.innerText
。这可能吗?如果是,您能给我一个提示吗?只需更改
myNumber
变量值,将用户键入的号码作为新的客户号码。您是指文本框值?
int myNumber=int.Parse(yourString)你不是在你的按钮点击或其他什么的时候做吗?我只是给你一个例子,你应该做你的验证。这不是我的工作是的,如果用户点击“添加客户”按钮。但是如果我重新启动程序呢。那么文本框是空的,我很抱歉。我完全不明白!然后只需添加一个if(string.IsNullOrEmpty(textBox1.Text)你不是在你的按钮点击中做吗?我只是给你一个例子,你应该进行验证。这不是我的工作。如果用户点击“AddCustomer”按钮,那不是我的工作。但是如果我重新启动程序,那么文本框是空的呢?对不起,我完全不明白!然后只需添加一个if(string.IsNullOrEmpty(textBox1.Text)