【问题标题】:Getting xml node values try using SelectSingleNode and SelectNodes using c#获取 xml 节点值尝试使用 SelectSingleNode 和 SelectNodes 使用 c#
【发布时间】:2014-01-17 08:47:15
【问题描述】:

在我的应用程序中,如果用户在另一个文本框中输入数字(例如:用户在 textbox1 中输入数字“123”),我希望在文本框中显示 xml 节点的值。应用程序应检查 xml如果“123”存在,然后获取其他节点的值)。但是xml文件不是固定的。它由应用程序本身创建(用户在文本框中输入的内容)。

几个小时后我还是不明白。这听起来很简单(我相信对你们中的大多数人来说确实如此),但我是 C# 的大新手。所以我google了很多,最后找到了SelectSingleNodeSelectNodes。首先我尝试了这段代码:

private void txtKNrNew_Leave(object sender, EventArgs e)
{
    XDocument xdoc = XDocument.Load(path + "\\save.xml");
    int CustNos;

    if (Int32.TryParse(txtKNrNew.Text, out CustNos))
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(path + "\\save.xml");

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

        var SurnameNode = xmlDoc.SelectSingleNode("Buchhaltung/Customers/Surname");
        var ForenameNode = xmlDoc.SelectSingleNode("Buchhaltung/Customers/Forename");
        string surname = SurnameNode.InnerText;
        string forename = ForenameNode.InnerText;

        if (CustNoExist != null)
        {
            txtSurnameNew.Text = surname;
            txtForenameNew.Text = forename;
        }
    }
}

这总是返回第一个 xml 节点的值(这里:“Stuff”和“Thing”。最后你可以看到 XML 文件)。所以我尝试使用SelectNodes:

private void txtKNrNew_Leave(object sender, EventArgs e)
{
    XDocument xdoc = XDocument.Load(path + "\\save.xml");
    int CustNos;

    if (Int32.TryParse(txtKNrNew.Text, out CustNos))
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(path + "\\save.xml");

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

        var SurnameNode = xmlDoc.SelectNodes("Buchhaltung/Customers/Surname");
        var ForenameNode = xmlDoc.SelectNodes("Buchhaltung/Customers/Forename");
        string surname = SurnameNode[0].InnerText;
        string forename = ForenameNode[0].InnerText;

        if (CustNoExist != null)
        {
            txtSurnameNew.Text = surname;
            txtForenameNew.Text = forename;
        }
    }
}

这返回给我的结果与另一个相同。我知道因为我使用[0]。所以[]中的数字不应该是固定的。但是有没有办法解决这个问题?哪种方式更好?如何正确获取我想要的值?

有人可以帮我或给我一个提示吗?

谢谢, 泰勒

PS:在这里你可以看到我生成的 XML 文件:

<Buchhaltung>
  <Customers>
    <CustNo>123</CustNo>
    <Surname>Stuff</Surname>
    <Forename>Thing</Forename>
    <Addr>Addr</Addr>
    <Zip>Zip</Zip>
    <Place>Place</Place>
    <Phone>Phone</Phone>
    <Mail>Mail</Mail>
  </Customers>
  <Customers>
    <CustNo>137</CustNo>
    <Surname>Other</Surname>
    <Forename>Name</Forename>
    <Addr>Address</Addr>
    <Zip>12345</Zip>
    <Place>New York</Place>
    <Phone>1234567890</Phone>
    <Mail>mail@example.com</Mail>
  </Customers>
</Buchhaltung>

【问题讨论】:

    标签: c# xml xmlnode


    【解决方案1】:

    您可以使用以下 XPath 表达式:

    var expression = String.Format("//Customers[CustNo/text() = {0}]/", CustNos);
    
    var SurnameNode = xmlDoc.SelectNodes(expression + "Surname");
    var ForenameNode = xmlDoc.SelectNodes(expression +"Forename");
    

    【讨论】:

    • 感谢您的回答。你能解释一下第一行吗?没看懂
    • 这是 XPaht 表达式,它表示:查找包含子元素 CustNo 的任何客户元素 (//Customers),其值为 CustNo 变量 ([CustNo/text() = 123] )。然后我连接“姓氏”和“名字”以获得找到的客户元素的正确子元素。我原来的帖子有一个错误,但我现在已经更正了。
    【解决方案2】:

    你可以使用 LINQ2XML

    XDocument doc=XDocument.Load(path);
    var node=doc.Elements("Customers")
                .SingleOrDefault(x=>x.Element("CustNo").Value==CustNos.ToString());
    if(node!=null)
    {
       txtSurnameNew.Text=node.Element("Surname").Value;
       txtForenameNew.Text=node.Element("Forename").Value;
    }
    

    【讨论】:

    • 感谢您的回答。如果我使用此代码,我会在txtSurnameNew.Text= 收到此错误消息:the object reference not set to an instance of an object
    【解决方案3】:

    怎么样:

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(path + "\\save.xml");
    
    var xmlNodeExist = "Buchhaltung/Customers/CustNo";
    var CustNoExist = xdoc.XPathSelectElements(xmlNodeExist).FirstOrDefault(x => (int)x == CustNos);
    
    var SurnameNode = xmlDoc.SelectNodes("Buchhaltung/Customers/Surname");
    var ForenameNode = xmlDoc.SelectNodes("Buchhaltung/Customers/Forename");
    
    if (CustNoExist != null)
    {
        foreach(XmlNode xn in SurnameNode)
        {
            txtSurnameNew.Text += xn.InnerText + Environment.Newline;
        }
    
        foreach(XmlNode xn in ForenameNode)
        {
            txtForenameNew.Text += xn.InnerText + Environment.Newline;
        }
    }
    

    希望对您有所帮助。托比

    【讨论】:

    • 这不起作用,因为我不能同时使用Newline 并且是xdocxmlDoc 并且xdoc 没有定义
    • 那么你可以使用:foreach(XmlNode xn in SurnameNode) { txtSurnameNew.Text += xn.InnerText + ", "; } foreach(XmlNode xn in ForenameNode) { txtForenameNew.Text += xn.InnerText + ", "; } “xdoc”来自你的代码 :)
    • 嗯,这也不起作用:/我收到此错误:reference not set to an instance of an object
    猜你喜欢
    • 2021-10-27
    • 2019-12-03
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多