我正在尝试构建一个自动测试评分应用程序,我希望最终结果是一个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);
}
}
答案 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
,那么您就是在浪费用户的时间。