我会尽量保持简短,并提前感谢你。
我创建了一个测验。问题和答案,以及正确答案的整数都是通过get和set,在构造函数中完成的,然后通过创建一个对象并为其提供参数在另一个类中创建。它看起来如下:
allQuestions = new Question[3];
allQuestions[0] = new Question("Question1", "answer1", "answer2",
"answer3", "answer4", 2);
其中2是整数,表示答案2是正确的。
我在我的代码中几乎每个函数都使用这个数组。 现在我决定从XML文档中获取问题,而不是在这里创建它们。我是一名C#初学者,所以我一直玩,无法让它发挥作用。
我自制的xml如下所示:
<questions>
<question>
<ID>1</ID>
<questiontext>Peter</questiontext>
<answer1>der</answer1>
<answer2>da</answer2>
<answer3>21</answer3>
<answer4>lol</answer4>
</question>
<question>
<ID>2</ID>
<questiontext>Paul</questiontext>
<antwort1>dasistid2</antwort1>
<antwort2>27</antwort2>
<antwort3>37</antwort3>
<antwort4>47</antwort4>
</question>
</questions>
所以2个基本节点(?) 你能解释一下如何阅读那个并将它存储到我的数组中,这样我仍然可以使用我的数据。 &#34; allQuestions.Question1&#34; ?看了很多youtube教程,仍然无法让它在这个项目中运行。
使用Visual Studio 2017,WPF,C#
答案 0 :(得分:0)
有很多方法可以做你想做的事情。我将给你一个手动解决方案的肮脏例子,以及一个应该工作的更自动的解决方案。请注意,自动版本不会使用您的构造函数,因此除非您定义了空构造函数,否则它可能对您不起作用。
使用XML Linq进行手动处理:
public IList<Question> ParseXml(string xmlString)
{
var result = new List<Question>();
var xml = XElement.Parse(xmlString);
var questionNodes = xml.Elements("question");
//If there were no question nodes, return an empty collection
if (questionNodes == null)
return result;
foreach (var questionNode in questionNodes)
{
var idNode = questionNode.Element("ID");
var textNode = questionNode.Element("questiontext");
var ant1Node = questionNode.Element("antwort1");
var ant2Node = questionNode.Element("antwort2");
var ant3Node = questionNode.Element("antwort3");
var ant4Node = questionNode.Element("antwort4");
var question = new Question();
question.Id = Convert.ToInt32(idNode?.Value);
// note the '?.' syntax. This is a dirty way of avoiding NULL
// checks. If textNode is null, it returns null, otherwise it
// returns the textNode.Value property
question.Text = textNode?.Value;
question.AnswerOne = ant1Node?.Value;
question.AnswerTwo = ant2Node?.Value;
question.AnswerThree = ant3Node?.Value;
question.AnswerFour = ant4Node?.Value;
result.Add(question);
}
return result;
}
接下来我们有了XmlSerializer方法。这在所有情况下都不理想,但提供了一种将对象序列化为XML并将XML反序列化为对象的简便方法。
public QuestionCollection autoparsexml(string xml)
{
//create the serializer
XmlSerializer serializer = new XmlSerializer(typeof(QuestionCollection));
//convert the string into a memory stream
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
//deserialize the stream into a c# object
QuestionCollection resultingMessage = (QuestionCollection)serializer.Deserialize(memStream);
}
public class QuestionCollection
{
public List<Question> Questions { get; set; }
}