Linq-Xml [DirectoryNotFound或NullReferenceException]

时间:2012-11-11 10:17:43

标签: xml exception error-handling xna load

我是Xna的新手,我想加载和读取XML文件。 在互联网上搜索了几个小时后,我仍然没有得到它没有加载文件。 每当我尝试启动它时都有一个(DirectoryNotFoundException),当我尝试将它复制到调试目录时,有一个(NullReferenceException)

下载:http://www.mediafire.com/?z6w36b73cufy3co

加载方法:(代码中的第二个,但无论如何我都会上传整个项目)

    private void InitLevel(int levelNum)
    {
        actlevel = levelNum;
        levelData = (from level in XElement.Load("Data\\Levels.xml").Descendants("Level")
                      where (int)level.Attribute("Number") == levelNum
                      select new LevelData
                      {
                          number = levelNum,
                          changeDirChance = (int)level.Attribute("ChangeDirChance"),
                          maxActiveAliens = (int)level.Attribute("MaxActiveAliens"),
                          totalAliensToFinish = (int)level.Attribute("TotalAliensToFinish"),
                          boss = alienTypes[(string)level.Attribute("Boss")],
                          fireChance = (int)level.Attribute("FireChance"),
                          maxAlienBullets = (int)level.Attribute("MaxAlienBullets"),
                          alienGenerationTime = TimeSpan.FromMilliseconds((int)level.Attribute("AlienGenerationTime")),
                          selectionData = (from sel in level.Descendants("AlienType")
                                           select new AlienSelectionData
                                           {
                                               chance = (int)sel.Attribute("Chance"),
                                               alien = alienTypes[(string)sel.Attribute("Name")]
                                           }).ToList()
                      }).SingleOrDefault();
        Debug.Assert(levelData != null);
    }

和XML文件(/ Data中的Levels.xml):

<?xml version="1.0" encoding="utf-8" ?>
<Levels>
  <Level Number="1" MaxActiveAliens="7" TotalAliensToFinish="15" Boss="boss1"
         AlienGenerationTime="800" ChangeDirChance="2" FireChance="2" MaxAlienBullets="5">
    <AlienTypes>
      <AlienType Name="alien1" Chance="25" />
      <AlienType Name="alien2" Chance="20" />
      <AlienType Name="alien3" Chance="20" />
      <AlienType Name="alien4" Chance="5" />
    </AlienTypes>
  </Level>
  <Level Number="2" MaxActiveAliens="10" TotalAliensToFinish="25" Boss="boss2"
         AlienGenerationTime="600" ChangeDirChance="2" FireChance="3" MaxAlienBullets="7">
    <AlienTypes>
      <AlienType Name="alien1" Chance="20" />
      <AlienType Name="alien2" Chance="20" />
      <AlienType Name="alien3" Chance="20" />
      <AlienType Name="alien4" Chance="15" />
      <AlienType Name="alien5" Chance="10" />
    </AlienTypes>
  </Level>
</Levels>

1 个答案:

答案 0 :(得分:0)

你有两种选择来实现它:

A)使用内容管道

如果你想从Xbox游戏中加载它,这是一个选择。    使导入器和处理器加载并将其返回为:

  1. 一个字符串。

  2. 或您的等级类型

  3. B)使用System.IO

    将文件添加到解决方案并转到文件属性并将“复制到输出文件夹”选项设置为“始终复制”,您将能够从相对于可执行文件的文件夹加载文件。这似乎是您的代码所需要的,但它在xbox游戏中不起作用。

    修改

    我调试了你的代码......

    1)您必须为“alientypes.xml”和“levels.xml”文件设置“始终复制选项”

    2)在加载“alienTypes”字段之前调用“InitLevel”,因此该字段为空...所以InitLevelsgive为空引用异常....

      public void Initialize( ContentManager Content )
        {
            player.Initialize( );
            stars.Initialize( width, height );
            shot.Initialize( );
    --->    InitLevel( 1 );
    
            // XML Datei
    --->    alienTypes = (from at in XElement.Load( "data/alientypes.xml" ).Descendants( "AlienType" )
                          select new AlienType.....
    

    3)我已经修改了你的代码以便更容易地调试它...现在很容易跟踪它找到失败的地方......“alientypes”为null ..

        private void InitLevel( int levelNum )
        {
            actlevel = levelNum;
            var levels =  XElement.Load( "Data\\Levels.xml" ).Descendants( "Level" );
            var level = levels.Where( l => ( int ) l.Attribute( "Number" ) == levelNum ).SingleOrDefault( );
    
            levelData = new LevelData( );
    
            levelData.number = levelNum;
            levelData.changeDirChance = ( int ) level.Attribute( "ChangeDirChance" );
            levelData.maxActiveAliens = ( int ) level.Attribute( "MaxActiveAliens" );
            levelData.totalAliensToFinish = ( int ) level.Attribute( "TotalAliensToFinish" );
     ---->  levelData.boss = alienTypes[( string ) level.Attribute( "Boss" )];
            .....
    

    编辑2

    你的外星人类型xml有几个错误......老板需要“space”属性,而alien1的路径Texture =“Texures / sprites”应该是Texture =“Textures / sprites”......