【问题标题】:Check if XML node value already exists in xml file using c#使用c#检查xml文件中是否已经存在xml节点值
【发布时间】:2014-01-15 21:01:05
【问题描述】:

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

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

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");
}

我的 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>

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

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    这是因为您的 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);
    

    【讨论】:

    • 感谢您的回答。我认为这可以通过一些修复来工作。 myNumber 现在是“12”。所以应用程序检查是否有值为 12 的客户编号,对吗?那么值“13”呢?还是“14”及更多?如何检查这些?
    • 我想我可以使用.innerText。这可能吗?如果是的话,你能给我一个提示吗?
    • 只需将myNumber 变量值更改为用户键入的号码作为新客户号码。
    • 你的意思是文本框值?
    • int myNumber = int.Parse(yourString);
    【解决方案2】:

    您当前正在测试是否存在任何“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);
    

    【讨论】:

    • 如果我只有“12”作为节点值,这个解决方案有效,对吧?如果我得到最多 100 个数字怎么办?然后我也必须检查这些是否已经存在。
    【解决方案3】:

    您可以使用 LINQ to XML

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

    【讨论】:

    • 你不是在你的按钮点击什么的吗??
    • 我只是给你一个例子,你应该做你的验证。这不是我的工作
    • 是的,如果用户点击了“AddCustomer”按钮。但是,如果我重新启动程序怎么办。然后文本框为空
    • 对不起。我完全误解了!
    • 然后只需添加一个 if(string.IsNullOrEmpty(textBox1.Text)
    【解决方案4】:

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

    int custNo = 12;
    var xmlNodeExist = String.Format("Buchhaltung/Customers[CustNo={0}]", custNo);
    

    它会选择 Customers 元素,但由于您只是在检查是否存在,所以这并不重要。

    W3Schools 有一个很好的tutorial/reference on XPath

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多