Не уверен, как получить доступ к вложенным XML в C# - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь десериализовать файл XML в соответствующие объекты C#. Я прочитал другие ответы, и я в растерянности относительно того, что я делаю неправильно. Вот мой XML файл

<?xml version="1.0" encoding="utf-8"?>
<DialogueObjectCollection>
<DialogueObjects>
    <DialogueObject id="0001">
        <name>CHARACTER</name>
        <dialogue>
            <text tag="1">Hi, this is a message.</text>
            <text tag="2">Yup.</text>
            <text tag="3">What do you want to do?
                <options>
                    <option action= "1">Go back.</option>
                    <option action="4">Tell me something new.</option>
                </options>
            </text>
            <text tag= "4">This is the end.</text>
        </dialogue>
    </DialogueObject>
    <DialogueObject id="0002">
        <name>CHARACTER2</name>
        <dialogue>
            <text tag="1">Hi.</text>
        </dialogue>
    </DialogueObject>
</DialogueObjects>
</DialogueObjectCollection>

Вот мои классы:

{
    [Serializable(), XmlRoot("DialogueObject")]
    public class DialogueObject
    {
        [XmlAttribute("id")]
        public string id { get; set; }


        [XmlElement("name")]
        public string name { get; set; }


        [XmlAttribute("tag")]
        public int tag { get; set; }

        public OptionHolder option;


        public DialogueHolder dialogueHolder { get; set; }


        [XmlAttribute("action")]
        public string action { get; set; }

    }

    [Serializable(), XmlRoot("dialogue")]
    public class DialogueHolder
    {
        [XmlArray("dialogue")]
        [XmlArrayItem("text", IsNullable = false)]
        public TextItem[] dialogue { get; set; }
    }

    [Serializable(),XmlRoot("text")]
    public class TextItem
    {
        [XmlAttribute]
        public string tag { get; set; }


        public string text { get; set; }


    }

    [Serializable(),XmlRoot("option")]
    public class OptionHolder
    {
        [XmlAttribute]
        public string action;

        [XmlElement("option")]
        public string option;
    }

    [Serializable()]
    [System.Xml.Serialization.XmlRoot("DialogueObjectCollection")]
    public class DialogueObjectCollection
    {
        [XmlArray("DialogueObjects")]
        [XmlArrayItem("DialogueObject", typeof(DialogueObject))]
        public DialogueObject[] dialogueObject { get; set; }
    }

И мой метод:

public static void LoadDialogue()
    {

        DialogueObjectCollection dialogueCollection = null;
        string path = "Content/NPCdata.xml";

        XmlSerializer serializer = new XmlSerializer(typeof(DialogueObjectCollection));

        Console.WriteLine("LOADDINGGGG");
        StreamReader reader = new StreamReader(path);
        dialogueCollection = (DialogueObjectCollection)serializer.Deserialize(reader);

 //test print       Console.WriteLine(dialogueCollection.dialogueObject.First().dialogueHolder.dialogue.First().text);

    }

Итак, это говорит мне, что dialogHolder возвращая ноль. Я могу получить dialogObject.First (). Name и id для печати. Я не могу понять, почему текст диалога не загружается в него. (Мои попытки исправить это включали добавление атрибутов XmlRootNode и добавление дополнительных классов - я новичок в XML сериализации в C#)

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 03 апреля 2020

попробуйте код ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication3
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            LoadDialogue(FILENAME);
        }
        public static void LoadDialogue(string path)
        {

            XmlReader reader = XmlReader.Create(path);
            XmlSerializer serializer = new XmlSerializer(typeof(DialogueObjectCollection));
            DialogueObjectCollection dialogueObjectCollection = (DialogueObjectCollection)serializer.Deserialize(reader);

        }
    }

    [Serializable(), XmlRoot("DialogueObject")]
    public class DialogueObject
    {
        [XmlAttribute("id")]
        public string id { get; set; }


        [XmlElement("name")]
        public string name { get; set; }


        [XmlAttribute("tag")]
        public int tag { get; set; }

        public OptionHolder option;

        [XmlElement("dialogue")]
        public DialogueHolder dialogueHolder { get; set; }


        [XmlAttribute("action")]
        public string action { get; set; }

    }

    [Serializable(), XmlRoot("dialogue")]
    public class DialogueHolder
    {
        [XmlElement("text")]
        public TextItem[] texItem { get; set; }
    }

    [Serializable(), XmlRoot("text")]
    public class TextItem
    {
        [XmlAttribute]
        public string tag { get; set; }

        [XmlText()]
        public string text { get; set; }

        [XmlArray("options")]
        [XmlArrayItem("option")]
        public OptionHolder[] options { get; set; }
    }

    [Serializable(), XmlRoot("option")]
    public class OptionHolder
    {
        [XmlAttribute]
        public string action;

        [XmlElement("option")]
        public string option;
    }

    [XmlRoot("DialogueObjectCollection")]
    public class DialogueObjectCollection
    {
        [XmlArray("DialogueObjects")]
        [XmlArrayItem ("DialogueObject")]
        public DialogueObject[] dialogueObject { get; set; }
    }
}
...