创建要由多个程序使用的XML文档C#

时间:2014-04-07 18:45:17

标签: c# xml visual-studio xpath

快速了解我要做的事情...我有一个我创建的表单enter image description here这样做的是当用户点击Add按钮时它会调出一个文件浏览器对话框,让用户选择一个文件。

选择后,文件将被添加到XML文档和报告列表中。

我认为移除按钮是不言自明的。

我需要这个文件能够被我创建的另一个程序读取,因此它可以相应地获取正确的信息。

我正在考虑使用数据集,但我决定反对,因为我需要有一个固定的xml文件位置,如果我有一个数据集,我不知道用户计算机将放置源的位置数据集。这就是我想我会跳过数据集并手动制作XML文件的原因。

唯一的问题是错误,我修复了一个错误,弹出一个新错误。我目前得到的错误发生在addButton方法中,并说我无法访问XML文件,因为它已被其他进程使用。尝试通过确保文件在访问之前关闭来解决这个问题,但仍然没有做到这一点。

我使用常规XmlDocument来阅读和编辑列表中的项目,然后使用XPath添加一个全新的项目。下面是完整的代码和XML格式,但我现在会说我对它不是很满意,因为它非常不一致。所以我想我的主要问题是这样做的正确方法是什么?

C#代码

public partial class selectPOSReports : Form
    {
        XmlDocument doc = new XmlDocument();

        public selectPOSReports()
        {
            InitializeComponent();

            if (!File.Exists(@"C:\Users\Public\MEC\posReportList.xml"))
            {
                Directory.CreateDirectory(@"C:\Users\Public\MEC");
                doc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?><Reports count=\"0\"></Reports>");
                doc.Save(@"C:\Users\Public\MEC\posReportList.xml");

            }
            else
            {
                doc.Load(@"C:\Users\Public\MEC\posReportList.xml");
            }

            XmlNodeList excelReportList = doc.SelectNodes("//Workbook");

            foreach (XmlNode excelReport in excelReportList)
            {
                reportList.Items.Add(excelReport.InnerText);
            }
        }

        private void addButton_Click(object sender, EventArgs e)
        {
            int newIndex = 0;
            if ( selectReportDialog.ShowDialog() == DialogResult.OK ) {
                doc.Save(@"C:\Users\Public\MEC\posReportList.xml");
                string fileName = selectReportDialog.FileName;
                string filePath = Path.GetPathRoot(fileName);
                XDocument xd = XDocument.Load(XmlReader.Create(@"C:\Users\Public\MEC\posReportList.xml"));
                xd.Element("Reports").Add(
                    new XElement("Report", new XAttribute("id", newIndex),
                    new XElement("Workbook", fileName),
                    new XElement("Filepath", filePath)));
                xd.Save(@"C:\Users\Public\MEC\posReportList.xml");
                reportList.Items.Add(fileName);
            }
        }

        private void removeButton_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("Are you sure you want to remove " + reportList.SelectedItems.ToString() + " from the list?",
                            "Remove Excel Report",
                            MessageBoxButtons.YesNo,
                            MessageBoxIcon.Warning);

            if (result == DialogResult.Yes)
            {
                int index = reportList.SelectedIndex;
                string sindex = index.ToString();
                XmlNode deleteNode = doc.GetElementById(sindex);
                deleteNode.ParentNode.RemoveChild(deleteNode);
                doc.Save("posReportList.xml");
                reportList.Items.RemoveAt(index);
            }
        }
    }

XML布局

<Reports count="1"><!--Count will be updated as items are added-->
    <Report id="1">
        <Workbook>SomeBook.xlsx</Workbook>
        <Filepath>C:/SomePath</FilePath>
    </Report>
</Reports>

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您的添加按钮点击事件

上有两个保存命令
doc.Save(@"C:\Users\Public\MEC\posReportList.xml");

xd.Save(@"C:\Users\Public\MEC\posReportList.xml");

猜猜你只需要第二个,第一个是某种重构努力的残余?