【问题标题】:Find Xml attribute by value, and change its other value按值查找 Xml 属性,并更改其其他值
【发布时间】:2015-02-11 06:57:39
【问题描述】:

所以,下面我编写了一个代码,在加载时按名称(Selena 和 Maria)列出了我在 comboBox1 中的 2 个项目,当我选择其中一个项目时,比如说 Maria,然后单击 button1,它会填充我的 3 个文本框使用 Maria 的 name、usn 和 pawd 属性值,它看起来像: 显示名称:玛丽亚 用户名:mary26 密码:d4e5r

我对这部分代码很满意,因为它符合我的目的。

但我正在努力解决我想要弄清楚的部分代码。 我创建了一个 button2,我希望当我更改显示名称、用户名或密码文本框的值并单击保存时,它会保存到 xml 文件中的正确位置,保存到 Maria,而不是保存到 Selena 或别的东西。

我已经尝试浏览了一周,并尝试了多种解决方案,但我找不到任何解决方案。

att.xml:

<database>
<item name="Selena" usn="sele22" pawd="fed47a"></item>
<item name="Maria" usn="mary26" pawd="d4e5r"></item>
<database>

我的项目:

private void Form3_Load(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            XmlTextReader reader = new XmlTextReader("att.xml");
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.Name == "item")
                    {
                        comboBox1.Items.Add(reader.GetAttribute("name"));
                    }
                }
            }

            reader.Close();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string secit = comboBox1.SelectedItem as string;
            XmlTextReader lola = new XmlTextReader("att.xml");
            while (lola.Read())
            {
                if (lola.NodeType == XmlNodeType.Element)
                {
                    string poop = lola.GetAttribute("name"); 
                    if (poop == secit) 
                    {
                        string username = lola.GetAttribute("usn"); 
                        string password = lola.GetAttribute("pawd");
                        string dispname = lola.GetAttribute("name");

                        textBox1.Text = dispname;
                        textBox2.Text = username;
                        textBox3.Text = password;

                    }
                }
            }

            lola.Close();
        }

【问题讨论】:

  • 你应该看一下 XmlDocument - 它会将内容加载到内存中并创建一个更随机访问的文档。

标签: c# xml


【解决方案1】:

您可以像这样使用 XmlDocument:

XmlDocument doc = new XmlDocument();
doc.Load("att.xml");
foreach(XmlNode item in doc.SelectNodes("//item"))
    comboBox1.Items.Add(item.Attributes["name"].Value);


void button3_Click(object sender, NotifyArgs e)
{
    XmlNode item = doc.SelectSingleNode("//item[@name='" + comboBox1.Text + "']");
    if (item == null) return;
    item.Attributes["name"].Value = textBox1.Text;
    ...
    doc.Save("att.xml");
}

【讨论】:

    【解决方案2】:

    如果您想学习 LINQ,另一种选择是使用 XDocument

    假设您有一个单独的方法来更新 XML 文件,可能看起来像这样。

    private static void Update(string key, string pwd, string usn)
    {
        // Enter code here to update the item
    }
    

    您可以使用 XPath 查找具有名称的元素:

    var document = XDocument.Load("XMLFile1.xml");
    var element = document.XPathSelectElement(string.Format("/database/item[@name = \"{0}\"]", key));
    if (element != null)
    {
        element.SetAttributeValue("usn", usn);
        element.SetAttributeValue("pawd", pwd);
        document.Save("XMLFile2.xml");
    }
    

    或者通过使用 XDocument/XElement/LINQ 方法查找文档:

    var document = XDocument.Load("XMLFile1.xml");
    var element = document.Elements("database")
        .Elements("item")
        .Attributes("name")
        .Where(a => a.Value == key)
        .Select(a => a.Parent)
        .SingleOrDefault();
    if (element != null)
    {
        element.SetAttributeValue("usn", usn);
        element.SetAttributeValue("pawd", pwd);
        document.Save("XMLFile3.xml");
    }
    

    或者您可以将其重写为 LINQ 表达式。

    var document = XDocument.Load("XMLFile1.xml");
    var elements = from e1 in document.Elements()
                    where e1.Name == "database"
                    from e2 in e1.Elements()
                    where e2.Name == "item"
                    from attribute in e2.Attributes()
                    where attribute.Name == "name" && attribute.Value == key
                    select e2;
    var element = elements.SingleOrDefault();
    if (element != null)
    {
        element.SetAttributeValue("usn", usn);
        element.SetAttributeValue("pawd", pwd);
        document.Save("XMLFile3.xml");
    }
    

    请随意适应。

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 1970-01-01
      • 2015-12-10
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多