使用Constructor将新XML存储到现有项目数组中

时间:2018-06-17 23:13:30

标签: c# xml

我会尽量保持简短,并提前感谢你。

我创建了一个测验。问题和答案,以及正确答案的整数都是通过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#

1 个答案:

答案 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; }
}