MonoGame 管道 XML 加载错误 'Element' 是无效的 XmlNodeType

MonoGame Pipeline XML Load error 'Element' is an invalid XmlNodeType

我正在尝试通过管道将 XML 文件加载到我的 MonoGame 游戏中,但出现错误。

'Element' is an invalid XmlNodeType. Line 10, position 6.

我已经在外部可移植 class 库项目中为 XML 文件创建了 classes,并将该 DLL 添加到管道内容引用中。但是,当我尝试在 MonoGame 管道应用程序中构建 XML 文件时,出现了上述错误。

有什么想法吗?

XML和Class代码如下

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();
    }
}

控制Buttons.cs

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

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

IntermediateSerializer,用于将 XML 内容导入 XNA/MonoGame 项目,希望集合中的项目用 <Item> 而不是 <Option> 标记,这就是为什么你收到错误。有 2 个选项供您解决此问题。

第一个选项是将每个 <Option> 标签更改为 <Item> 标签。如果您还没有在 XMLMenu 程序集上引用 MonoGame 程序集并且不希望添加依赖项,那么这是您的选择。

第二个,我认为更好的选项是添加对 MonoGame 程序集的引用,并向菜单中的选项数组添加一个属性 class。 ContentSerializer 属性有一个名为 CollectionItemName 的构造函数参数。如果将 "Option" 分配给此参数,则编译成功。我复制了您的设置,将菜单 class 修改为如下所示:

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 属性,我会收到与您相同的错误。

有关详细信息,请阅读本文的 "Collection" 和后续部分:https://blogs.msdn.microsoft.com/shawnhar/2008/08/12/everything-you-ever-wanted-to-know-about-intermediateserializer/