0

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

“元素”是无效的 XmlNodeType。第 10 行,第 6 位。

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

有任何想法吗?

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>

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

背景.cs

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

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

选项.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;
    }
}

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

控制按钮.cs

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

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

1 回答 1

1

用于将 XML 内容导入 XNA/MonoGame 项目的 IntermediateSerializer 期望集合中的项目被标记为<Item>not <Option>,这就是您收到错误的原因。您有 2 个选项可以解决此问题。

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

第二个,我认为更好的选项是添加对 MonoGame 程序集的引用,并向 Menu 类中的 Options 数组添加一个属性。ContentSerializer 属性有一个名为 CollectionItemName 的构造函数参数。如果您将“选项”分配给此参数,则编译成功。我复制了您的设置,将 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-中间序列化器/

于 2017-01-05T02:29:02.277 回答