保存XML文件似乎只保存一个条目

时间:2017-04-11 14:27:24

标签: c# .net xml linq-to-xml .net-core

我一直致力于一个将配置加载到XML文件并将其写入XML文件的应用程序。我知道有一些关于这样做的意见,但我一直遇到这个代码的问题。

        private static void AddToXmlTemplate(Template tmp, string _config)
    {
        string configFile = _config + "configuredTemplate.xml";
        FileStream fs = new FileStream(configFile, FileMode.OpenOrCreate);
        if (File.Exists(configFile)) {
            XDocument xD = new XDocument();
            xD.Add(new XElement("Store",
                new XElement("template",
                new XElement("filePath", tmp.TempPath),
                new XElement("Name", tmp.TempName),
                new XElement("description", tmp.TempDesc))));
            xD.Save(fs);
            fs.Flush();
            fs.Dispose();
            //commenting for change to allow sync.
        }
       else
        {
            /********------ appends the template to the config file.------*************/
            XDocument xD = XDocument.Load(fs);
            XElement root = xD.Element("Store");
            IEnumerable<XElement> rows = root.Descendants("template");
            XElement last = rows.Last();
            last.AddAfterSelf(
                new XElement("template"),
                new XElement("filePath", tmp.TempPath),
                new XElement("Name", tmp.TempName),
                new XElement("description", tmp.TempDesc));
            xD.Save(fs);
            fs.Flush();
            fs.Dispose();

        }
    }

这个整个函数在另一个函数的foreach循环中调用,所有函数都应检查文件夹中是否有配置文件,检查html文件,询问用户有关文件的信息,然后保存到XML文件。

我认为我需要将Filestream操作以及可能的XDocument移动到调用函数,并将它们传递给此函数。

最大的问题是它只保存最后一组节点。

3 个答案:

答案 0 :(得分:0)

我认为问题出在if (!File.Exists(configFile))上。你可以试试这个:

    private static void AddToXmlTemplate(Template tmp, string _config)
    {
        string configFile = Path.Combine(_config, "configuredTemplate.xml");
        using (FileStream fs = new FileStream(configFile, FileMode.OpenOrCreate))
        {
            if (!File.Exists(configFile))
            {
                 XElement xD = new XElement("Store",
                    new XElement("template"),
                    new XElement("filePath", tmp.TempPath),
                    new XElement("Name", tmp.TempName),
                    new XElement("description", tmp.TempDesc));
                xD.Save(fs);
                fs.Flush();
            }
            else
            {
                XDocument xD = XDocument.Load(fs);
                XElement root = xD.Element("Store");
                IEnumerable<XElement> rows = root.Descendants("template");
                XElement last = rows.Last();
                last.AddAfterSelf(
                    new XElement("template"),
                    new XElement("filePath", tmp.TempPath),
                    new XElement("Name", tmp.TempName),
                    new XElement("description", tmp.TempDesc));
                xD.Save(fs);
                fs.Flush();
            }
        }
    }

答案 1 :(得分:0)

你的if语句上的逻辑肯定是错误的吗?

目前,如果该文件存在,那么您正在创建一个新的xml文件,如果没有,则需要附加它,它需要反过来。

如果你把它改成它应该可以工作

if (!File.Exists(configFile)) {

答案 2 :(得分:0)

啊我认为它是因为你首先创建文件流然后检查它是否存在,所以它将永远存在。如果将其更改为

findWhere()