Ошибка загрузки XML конвейера MonoGame "Элемент" является недопустимым XmlNodeType

Я пытаюсь загрузить файл XML в свою игру MonoGame по конвейеру, но получаю ошибку.

"Элемент" является недопустимым XmlNodeType. Строка 10, позиция 6.

Я создал свои классы для файла XML во внешнем переносимом проекте библиотеки классов и добавил эту DLL к ссылкам на содержимое конвейера. Но когда я пытаюсь создать файл XML в приложении MonoGame Pipeline, я получаю вышеуказанную ошибку.

Есть идеи?

XML и код класса ниже

MainMenu.xml (я пометил строку ошибки комментарием в стиле xml, комментарий не в самом файле)

<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:ns="Microsoft.Xna.Framework">
  <Asset Type="Menu">
    <Title>Main Menu</Title>
      <Background>
          <Type>animation</Type>
          <Data>MainMenuBackground</Data>
      </Background>
      <Options>
          <Option> <!-- Error Here -->
              <Type>text</Type>
              <Name>new</Name>
              <Disabled>false</Disabled>
              <Text>New Game</Text>
              <Action>newGame</Action>
          </Option>
          <Option>
              <Type>text</Type>
              <Name>save</Name>
              <Disabled>true</Disabled>
              <Text>Save Game</Text>
              <Action>saveGame</Action>
          </Option>
          <Option>
              <Type>text</Type>
              <Name>load</Name>
              <Disabled>false</Disabled>
              <Text>Load Game</Text>
              <Action>loadGame</Action>
          </Option>
          <Option>
              <Type>text</Type>
              <Name>exit</Name>
              <Disabled>false</Disabled>
              <Text>Exit Game</Text>
              <Action>exitGame</Action>
          </Option>
      </Options>
      <Buttons>
          <Keyboard>
              <Accept>Enter</Accept>
              <Cancel>Esc</Cancel>
          </Keyboard>
          <Controller>
              <Accept>A</Accept>
              <Cancel>B</Cancel>
          </Controller>
      </Buttons>
  </Asset>
</XnaContent>

Menu.cs

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

namespace XMLMenu
{
    public class Menu
    {
        public String Title;
        public Background Background = new Background();
        public Option[] Options = new Option[] { };
        public Buttons Buttons = new Buttons();
    }
}

Background.cs

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

namespace XMLMenu
{
    public class Background
    {
        public String Type;
        public String Data;
    }
}

Option.cs

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

namespace XMLMenu
{
    public class Option
    {
        public String Type;
        public String Name;
        public Boolean Disabled;
        public String Text;
        public string Action;
    }
}

Buttons.cs

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

namespace XMLMenu
{
    public class Buttons
    {
        public ControlButtons Keyboard = new ControlButtons();
        public ControlButtons Controller = new ControlButtons();
    }
}

ControlButtons.cs

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

namespace XMLMenu
{
    public class ControlButtons
    {
        public String Accept;
        public String Cancel;
    }
}

1 ответ

Решение

IntermediateSerializer, используемый для импорта содержимого XML в проекты XNA/MonoGame, ожидает, что элементы в коллекции будут помечены <Item> не <Option> вот почему вы получаете ошибку. Есть 2 варианта для решения этой проблемы.

Первый вариант - поменять каждый <Option> пометить, чтобы быть <Item> тег. Если у вас еще нет ссылки на сборки MonoGame в вашей сборке XMLMenu и вы не хотите добавлять зависимость, тогда это ваш вариант.

Второй, и я думаю, лучший вариант, это добавить ссылку на сборки MonoGame и добавить атрибут в массив Options в вашем классе Menu. Атрибут ContentSerializer имеет аргумент конструктора с именем CollectionItemName. Если вы назначите "Option" этому параметру, компиляция завершится успешно. Я скопировал ваши настройки, изменил класс Menu, чтобы он выглядел так:

using Microsoft.Xna.Framework.Content;
using System;

namespace XMLMenu
{
    public class Menu
    {
        public String Title;
        public Background Background = new Background();
        [ContentSerializer(CollectionItemName = "Option")]
        public Option[] Options = new Option[] { };
        public Buttons Buttons = new Buttons();
    }
}

и преуспел в создании контента. Без атрибута ContentSerializer я получил ту же ошибку, что и вы.

Для получения дополнительной информации прочитайте раздел "Сбор" и соответствующие разделы этой статьи: https://blogs.msdn.microsoft.com/shawnhar/2008/08/12/everything-you-ever-wanted-to-know-about-intermediateserializer/

Другие вопросы по тегам