XNA介绍如何加载XML

XNA介绍如何加载XML,xna,Xna,我还是这里的新手。。。 我尝试了一个来自互联网的教程,关于如何在XNA game studio中加载XML 我的代码如下: using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content;

我还是这里的新手。。。 我尝试了一个来自互联网的教程,关于如何在XNA game studio中加载XML

我的代码如下:

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using Microsoft.Xna.Framework;
  using Microsoft.Xna.Framework.Audio;
  using Microsoft.Xna.Framework.Content;
  using Microsoft.Xna.Framework.GamerServices;
  using Microsoft.Xna.Framework.Graphics;
  using Microsoft.Xna.Framework.Input;
  using Microsoft.Xna.Framework.Media;
  using System.IO;

 namespace textInput
{

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    SpriteFont SpriteFont1;
    string credits;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";


    }


    protected override void Initialize()
    {


        base.Initialize();
    }


    protected override void LoadContent()
    {

        spriteBatch = new SpriteBatch(GraphicsDevice);
        SpriteFont1 = Content.Load<SpriteFont>("SpriteFont1");

    }


    protected override void UnloadContent()
    {

    }

    public string LoadFromFile()
    {

        using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create("XMLFile1.xml"))
        {
            reader.MoveToContent();
            reader.ReadToFollowing("credit");
            credits = reader.ReadInnerXml();
        }
        return credits;
    }



    protected override void Update(GameTime gameTime)
    {

        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        base.Update(gameTime);


    }


    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();
        spriteBatch.DrawString(SpriteFont1, credits, new Vector2(20, 40), Color.White);
        spriteBatch.End();
        base.Draw(gameTime);
    }

}
}
当我调试它时,ArgumentNullException是spriteBatch.DrawStringSpriteFont1上未处理的窗口显示,credits,new Vector220,40,Color.White

它说,值不能为null。 参数名称:text


有人知道如何解决这个问题吗?

似乎LoadFromFile在代码中的任何地方都不会被调用。尝试调用LoadFromFile;在LoadContent方法中。如果XML文件不是空的,它应该可以工作。
该错误是由于credits字符串为null而导致的,在绘图时没有为其分配任何值。

我认为您应该使用XElement等方法,因为它们将使您更好地控制xml数据。您可以将整个xml文件读入一个父元素,如: XElement输入=XElement.Loadpath-to-xml;

当您的xml看起来像:

Y

然后,整个xml文件将成为输入元素。 您可以使用input.Elementmaster-elem获取主元素,该元素返回一个包含主元素中所有元素的XElement。当然,您可以在链中调用它,并获取元素的任何值或元素的属性。比如: input.Elementmaster-elem.Elementsome-elem.Attributesome-attr.Value
如果您有大量的数据,我建议您看看linq,它类似于对象的sql。

还有一件事:您可能希望将LoadFromFile的返回类型更改为void。似乎您正在更改方法中全局变量credits的值,并返回同一变量的值。很抱歉再次询问。我试着调用LoadFromFile;在LoadContent中。但当我调试它时,会显示FileNotFoundException wa unhandled窗口。它说找不到文件“C:\Documents and Settings\aolas\My Documents\Visual Studio 2010\Projects\textInput\textInput\bin\x86\Debug\XMLFile1.xml”。这是因为指定位置不存在.xml文件。将XMLFile1.xml文件更准确地放在程序的可执行文件附近,如下:\textInput\bin\x86\Debug\。如果已将.xml文件添加到项目中,请确保将其属性更改为“始终在输出目录上复制”!在另一个方向上,您可以将XElement和XAttributes创建到一个XElement中,然后使用其静态保存方法将其保存到一个xml中。