【问题标题】:Reading and Writing Data to XML读取和写入数据到 XML
【发布时间】:2013-08-19 14:46:31
【问题描述】:

我一直在修补这个项目,但遇到了一堵砖墙。这是我的第一个项目,我真的不知道从哪里开始。我正在尽最大努力阅读下一步是什么,这样我就不必再在这里发帖了,但似乎我别无选择。

无论如何,这里是关于我试图通过这个项目完成什么的简要说明。我正在尝试从现有 XML 文档中的三个元素中检索某些值。在将每个元素的每个值加载到其各自的文本框中后,我会尝试将值的任何更改保存到文档中。 (说起来容易!)

我正在使用 XDocument 将值存储到一个列表中,然后将它们显示到它们的文本框中。

我不知道如何将更改更新回原始值并保存。到目前为止,尝试保存给我留下了一个空白的 XML 文档并使我的应用程序崩溃。 :\

这是我可以读取和显示的 XML 数据:

<client>
  <endpoint address="http://127.0.0.1:8086">
  <endpoint address="http://127.0.0.1:8084">
  <endpoint address="net.tcp://127.0.0.1:8085">
</client>

这是我迄今为止编写的一些代码。

    OpenFileDialog AgentConfig = new OpenFileDialog();

    private void button1_Click(object sender, EventArgs e)
    {

        AgentConfig.Filter = "Agent.exe.config (*.config)|*.config";
        if (AgentConfig.ShowDialog() == DialogResult.OK)
        {
            textBox1.Text = AgentConfig.FileName;
        }

        var addresses = XDocument.Load(AgentConfig.FileName)
                     .Descendants("endpoint")
                     .Select(x => (string)x.Attribute("address"))
                     .ToList();

        textBox2.Text = addresses[0];
        textBox3.Text = addresses[1];
        textBox4.Text = addresses[2];

        if (textBox2.Text != addresses[0])
        {
            addresses[0] = textBox2.Text;
        }

        if (textBox3.Text != addresses[1])
        {
            addresses[1] = textBox3.Text;
        }

        if (textBox4.Text != addresses[2])
        {
            addresses[3] = textBox4.Text;
        }


    }

    private void button2_Click(object sender, EventArgs e)
    {
        SaveFileDialog SF = new SaveFileDialog();
        if (SF.ShowDialog() == DialogResult.OK)
        {

        }
    }

任何帮助都将不胜感激。

提前致谢!

【问题讨论】:

  • 您可以让您的生活变得非常轻松,并使用List&lt;Address&gt;() 创建一个Client 类,然后查看XML 序列化,否则,是否真的检索到任何数据?错误在哪里,我想你需要x.Attribute("address").Value
  • 由于 endpoints 没有任何类型的 id 来区分彼此,因此您可能每次都需要保存所有三个值。 var client = new XElement("client", new XElement("endpoint", new XAttribute("address", textBox2.Text)), new XElement("endpoint", new XAttribute("address", textBox3.Text)), new XElement("endpoint", new XAttribute("address", textBox4.Text)));。然后打开 xml,找到之前的 client 节点,将其从其父节点中移除,并将新的 client 添加到该父节点并保存。
  • 忘了指出,您的文本框永远不会等于地址,因为您将文本分配给地址
  • Sayse:是的,数据已被检索。问题是尝试将对值所做的任何更改保存回 XML。科拉克:那会起作用吗?似乎它可能只是将第一个地址值替换了三个不同的时间。
  • 为什么你认为它会替换第一个地址值三个不同的时间?

标签: c# xml


【解决方案1】:
var xElem = new XElement("client",
    new XElement("endpoint", new XAttribute("address", textBox2.Text)),
    new XElement("endpoint", new XAttribute("address", textBox3.Text)),
    new XElement("endpoint", new XAttribute("address", textBox4.Text)));

xElem.Save(filename);

【讨论】:

  • 简单有效。我知道我应该使用类和不同的方式来提取、存储、显示和保存我的数据,但这是我的第一个项目,我的目标是用一种快速而肮脏的方式将它们组合在一起。这非常有效!
  • @bitbreaker - 如果这对你有用,你可能想accept这个作为答案。
【解决方案2】:

一种方法是使用以下类:

class System.Data.DataSet 

表示内存中的数据缓存,请参阅documentation

class System.IO.StramWriter  

实现一个 TextWriter 以将字符写入特定编码的流,请参阅documentation

然后像这样去:

DataSet ds = newDataSet();
CreateMyDataSet("your arguments"); // Create your DataSet according to your xml-format
StreamWriter sw = new StreamWriter(SaveFileDialog.FileName, ...);
sw.Write(ds.GetXml());  // GetXml() returns the xml representation of your data
sw.Close();  

【讨论】:

  • 我会对此进行更多研究。谢谢!
【解决方案3】:

尝试使用 Xml 编写器进行保存。这是给你的链接

[链接]http://www.dotnetperls.com/xmlwriter

【讨论】:

  • 谢谢,我一定会调查的。
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 2016-09-07
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
相关资源
最近更新 更多