我目前正在编写一个函数来保存和读取数据到/从和XML文档 LINQ。目前我可以很好地编写文档,但如果我将数据添加到现有项目,它只是添加一个新项目。我的目标是创建一个地址簿类型系统(是的,我知道那里有1000个,它只是我自己的一个学习项目)并且我尝试过ini和基本文本,但似乎XML是缺乏使用的最佳方式像sql这样的本地数据库。目前我有:
XDocument doc = XDocument.Load(@"C:\TextXML.xml");
var data = new XElement("Entry",
new XElement("Name", textBox1.Text),
new XElement("Address", richTextBox2.Text),
new XElement("Comments", richTextBox1.Text));
doc.Element("Contacts").Add(data);
doc.Save(@"C:\TextXML.xml");
我搜索 SO ,似乎无法找到如何追加/替换。 现在这样可以正确保存所有内容,即使我添加到文档中,但是如果我想要更新条目,我不知道如何在不创建新的“条目”的情况下,我也没有得到诀窍删除一个。 (我对C#还有点新鲜,并且自学成才,所以请原谅任何我忽视的事情。)
我的第二个问题围绕将信息加载到文本框中。 我可以将一个条目名称列表加载到列表框中,但是当我打开该条目的信息时,我不确定如何正确获取嵌套信息。 通过上面的例子,我需要类似于以下内容:
XDocument doc = XDocument.Load(@"C:\TextXML.xml");
boxName.Text = The name from the SelectedItem of the list box.
boxAddress.Text = The address child of the element named above etc.
我尝试过的每种方法我都会遇到一个空引用异常,这告诉我我没有指向正确的东西,但我不确定如何正确地处理这些事情。 我还尝试从列表框中创建SelectedItem的字符串和 var 来帮助命名,并使用ToString方法,但仍然无法弄清楚
答案 0 :(得分:0)
要替换值,可以在XElement中使用几个函数:
Value (property with a public setter)
SetValue()
SetElementValue()
SetAttributeValue()
ReplaceWith()
ReplaceNodes()
例如,如果要替换Name:
中的值data.Element("Name").SetValue("NewValue");
或
data.Element("Name").Value = "NewValue";
对于加载,一旦你拥有了你想要的XElement节点,那就像做
一样简单xelement.Value
或者如果它是属性:
xelement.Attribute("AttributeName").Value
以您的代码为例:
boxName.Text = doc.Element("Entry").Element("Name").Value;
编辑以发表评论:
如果我正在阅读您的评论,那么您需要提取姓名/地址/等。来自所有联系人主节点内节点的数据?
如果是这样,那么你可能想要这样的东西:
boxName.Text = string.Join(",", doc.Elements("Entry").Select(x => x.Element("Name").Value));
这将为您提供一个字符串,其中所有条目中的所有名称都以逗号分隔。只需将“名称”更改为“地址”即可对地址执行相同操作。
我建议搜索Linq to XML以查找有关如何使用此解析的更多信息。