Ошибка загрузки 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/