在C#中使用来自另一个XML文档的元素追加XML文档

时间:2015-11-03 01:27:50

标签: c# xml forms visual-studio

我正在尝试构建一个自动测试评分应用程序,我希望最终结果是一个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);
            }
        }

1 个答案:

答案 0 :(得分:0)

我很难关注您的代码,因为它是.Net 3.5 XML前代码。当3.5出现时,我开始使用C#。好像你正在为测试中的每个答案添加键?你所写的内容与你的描述没有关系。但如果这是你的目标,你可以试试这个。

如果您可以使用.Net 3.5,请使用XElement / XDocument,使用these converters执行

XElement test = xmlAnswers.ToXElement();
XElement keys = xmlAnswerKey.ToXElement();

test.Descendants("answer")
    .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("answer").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,那么您就是在浪费用户的时间。