0

我目前正在编写一个函数来通过 LINQ 向/从 XML 文档保存和读取数据。目前我可以很好地编写文档,但是如果我要向现有项目添加数据,它只会添加一个新项目。我的目标是创建一个地址簿类型系统(是的,我知道那里有 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 方法,但仍然无法弄清楚。

4

1 回答 1

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 以查找有关如何使用此解析的更多信息。

于 2013-05-09T00:33:15.953 回答