MonoGame管道XML加载错误“元素”是无效的XmlNodeType

时间:2017-01-03 15:33:27

标签: c# xml monogame content-pipeline

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

  

'Element'是无效的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>

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 个答案:

答案 0 :(得分:1)

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

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

第二个,我认为更好,选项是添加对MonoGame程序集的引用,并在Menu类的Options数组中添加一个属性。 ContentSerializer属性具有名为CollectionItemName的构造函数参数。如果您指定&#34;选项&#34;对于此参数,编译成功。我复制了你的设置,修改了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属性,我收到了与您相同的错误。

有关详细信息,请阅读&#34;收集&#34;以及本文中的前几节:https://blogs.msdn.microsoft.com/shawnhar/2008/08/12/everything-you-ever-wanted-to-know-about-intermediateserializer/