用C#中的另一个XML文档中的元素追加XML文档

本文关键字:XML 文档 追加 元素 另一个 | 更新日期: 2023-09-27 18:20:22

我正在尝试构建一个自动测试评分应用程序,我希望最终结果是savefiledialog提示,允许评分者将新的xml文件保存到任何位置。

诀窍是,我需要输出xml来包括原始测试+答案键的附加答案+最终成绩。这是我到目前为止所做的,但我犯了一个错误。我不熟悉.appendchild(),所以我认为这就是我的问题所在。

    private void cbOutput_Click(object sender, EventArgs e)
    {
        XmlNode rootTest = xmlAnswers.DocumentElement;
        XmlNode rootKey = xmlAnswerKey.DocumentElement;
        XmlNodeList nodeListTest = rootTest.SelectNodes("//answer");
        foreach (XmlNode item in nodeListTest)
        {
            XmlNode importNode = rootTest.OwnerDocument.ImportNode(rootKey, true);
            item.AppendChild(importNode);
        }
        SaveFileDialog savefiledialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "XML Files|*.XML";
        saveFileDialog1.Title = "Choose Location to Save Graded Test";
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            if (!string.IsNullOrEmpty(savefiledialog1.FileName))
            using (Stream s = File.Open(savefiledialog1.FileName, FileMode.Create))
            using (StreamWriter sw = new StreamWriter(s))
            {
                sw.Write(rootTest + tbTotal.Text);
            }
        }

用C#中的另一个XML文档中的元素追加XML文档

我很难理解您的代码,因为它是.Net 3.5之前的XML代码。当3.5问世时,我开始学习C#。似乎你在为测试中的每个答案添加密钥?从你写的描述中看没有意义。但如果这是你的目标,你可以试试这个。

如果您可以使用.Net 3.5,则使用XElement/XDocument,使用这些转换器进行

XElement test = xmlAnswers.ToXElement();
XElement keys = xmlAnswerKey.ToXElement();
test.Descendants("answerswer")
    .ToList()
    .ForEach(a => a.Add(new XElement(keys))); // Add clone of keys to each answer
// Dialog stuff
test.Save(savefiledialog1.FileName);

或者,使用您的描述(由于您的XML对我们来说是隐藏的,所以我必须尝试并弥补您应该做什么)。

XElement test = xmlAnswers.ToXElement();
XElement keys = xmlAnswerKey.ToXElement();
test.Add(keys.Descendants("answerswer").ToList()); // Add Answers to test
test.Add(new XElement("finalgrade", "A")); // Add final grade
// Dialog stuff
test.Save(savefiledialog1.FileName);

PS,不要在之外进行所有的转换、添加答案等

if (saveFileDialog1.ShowDialog() == DialogResult.OK)

否则,如果不是OK,那么您就是在浪费用户的时间。