【问题标题】:How to switch through attributes in XML XDocument XElement in C#如何在 C# 中的 XML XDocument XElement 中切换属性
【发布时间】:2013-02-05 14:32:31
【问题描述】:

我知道,这个主题有很多帖子,但是由于我在帖子中阅读了两天但没有任何效果,所以我决定在这里问。 我有一个这样的 XML (Level01.xml) 文件

<map version="1.0">
 <tileset>
  <image source="....>
 </tileset>
 <layer name="background">
     <data encoding="csv">
     3,3,3,3,3,3,3,
     3,3,3,3,3,3,3,
     3,3,3,3,3,3,3,
     3,3,3,3,3,3,3
     </data>
 </layer>
 <layer name="walls">
     <data encoding="csv">
     182,182,182,182,182,8,8,
     182,8,182,8,8,8,8,
     182,182,182,182,182,8,8,
     182,8,182,8,8,8,8,
     </data>
 </layer>
</map>

它是具有不同图层的(平铺)地图,我想在 XNA 中绘制它。因此我想将每一层的数据读入string[] 这是我尝试过的,但它不适用于第二个string[] walldata,我非常绝望,因为我不明白为什么

public class LevelXmlReader
{
    public string[] backgroundData;
    public string[] wallData;

    LevelXmlReader()
    {
        XDocument doc = XDocument.Load(@"Level/Level01.xml");
        foreach (XElement layer in doc.Element("map").Descendants("layer"))
        {

            var lay = doc.Element("map").Element("layer");
            var layName = lay.Attribute("name").Value;
            switch (layName)
            {
                case "background":
                    {
                        backgroundData = lay.Element("data").Value.Split(',');
                    }
                    break;
                case "walls":
                    {
                        wallData = lay.Element("data").Value.Split(',');
                    }
                    break;
            }

        }

    }

}

当我尝试绘制wallData 时,总是出现ExceptionError "Object reference not set to an instance of an object."

【问题讨论】:

    标签: c# .net xml linq linq-to-xml


    【解决方案1】:

    在你声明的循环中

    var lay = doc.Element("map").Element("layer");
    

    这是不必要的,因为您已经拥有单独的层。您需要完全删除该行并使用 foreach 循环中的 layer 变量。循环内部现在应该是这样的

    foreach (XElement layer in doc.Element("map").Descendants("layer"))
    {
        switch (layer.Attribute("name").Value)
        {
            case "background":       
                backgroundData = layer.Element("data").Value.Split(','); 
                break;
    
            case "walls":
                wallData = layer.Element("data").Value.Split(',');
                break;
        }
    }
    

    在您的代码中,您总是两次抓取同一层,而不是单步执行。

    【讨论】:

    • 然后接受答案。如果你一直问问题而不相信正确答案,人们会生你的气
    【解决方案2】:

    您正在使用foreach 迭代所有layer 标记。但是在循环内部,您没有使用它们。相反,您总是通过doc.Element("map").Element("layer") 访问第一层。

    【讨论】:

    • 非常感谢...这正是我的错误:D
    【解决方案3】:

    替换

    var lay = doc.Element("map").Element("layer");
    

    var lay = layer;
    

    您忽略了循环变量,而只使用了第一个元素。

    【讨论】:

      【解决方案4】:

      试试这个

      public class LevelXmlReader
      {
          public string[] backgroundData;
          public string[] wallData;
      
          LevelXmlReader()
          {
              XDocument doc = XDocument.Load(@"Level/Level01.xml");
              foreach (XElement layer in doc.Element("map").Descendants("layer"))
              {
                  var layName = layer.Attribute("name").Value;
                  switch (layName)
                  {
                      case "background":
                          backgroundData = layer.Element("data").Value.Split(',');
                          break;
      
                      case "walls":
                          wallData = layer.Element("data").Value.Split(',');
                          break;
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-28
        • 2014-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多