Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按值查找Xml属性,并更改其其他值_C#_Xml - Fatal编程技术网

C# 按值查找Xml属性,并更改其其他值

C# 按值查找Xml属性,并更改其其他值,c#,xml,C#,Xml,因此,下面我编写了一个代码,在comboBox1中按加载时的名称(Selena和Maria)列出了我的2个项目,当我选择其中一个,比如Maria,然后单击按钮1时,它会用Maria的名称、usn和pawd属性值填充我的3个文本框,看起来如下所示: 展品名称:玛丽亚 用户名:mary26 密码:d4e5r 我对这部分代码很满意,因为它符合我的目的 但我正在努力解决我试图弄明白的部分代码。 我创建了一个按钮2,我希望当我更改显示名称、用户名或密码文本框的值并单击“保存”时,它会保存到xml文件中的正

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

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

但我正在努力解决我试图弄明白的部分代码。 我创建了一个按钮2,我希望当我更改显示名称、用户名或密码文本框的值并单击“保存”时,它会保存到xml文件中的正确位置,保存到Maria,而不会保存到Selena或其他地方。

我已经试着浏览了一个星期了,有多种解决方案,但都找不到

att.xml:

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

您可以像这样使用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");
}

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

假设您有一个单独的方法来更新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");
}

您可以随意进行相应的调整。

您应该看看XmlDocument,它会将内容加载到内存中,并创建一个更像随机访问的文档。
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");
}