【问题标题】:Parsing XML with XmlDocument使用 XmlDocument 解析 XML
【发布时间】:2014-01-20 16:09:06
【问题描述】:

所以我尝试使用 XmlDocument 类在 C# 中解析 XML 文档。到目前为止,我已经成功地能够从名为<map> 的第一个节点加载数据。

    public void read()
    {
        XmlDocument doc = new XmlDocument();
        doc.Load("C:\\map.xml");

        parseMap(doc);
    }


    private void parseDoc(XmlDocument doc)
    {
        XmlNode map = doc.DocumentElement.SelectSingleNode("/map");

        int mapWidth = Convert.ToInt16(map.Attributes["width"].InnerText);
        int mapHeight = Convert.ToInt16(map.Attributes["height"].InnerText);
        int tileWidth = Convert.ToInt16(map.Attributes["tilewidth"].InnerText);
        int tileHeight = Convert.ToInt16(map.Attributes["tileheight"].InnerText);

        Console.Write("Map width: " + mapWidth + "\nMap height: " + mapHeight +
            "\nTile width: " + tileWidth + "\nTile height: " + tileHeight);

        int tilesetsCount = map.SelectNodes("tileset").Count;
        Console.Write("\nAmount of tilesets: " + tilesetsCount);
        foreach (XmlNode tileset in map.ChildNodes)
        {
            int firstgid = Convert.ToInt16(tileset.Attributes["firstgid"].InnerText);
            string name = tileset.Attributes["name"].InnerText;
            int tilesetTileWidth = Convert.ToInt16(tileset.Attributes["tilewidth"].InnerText);
            int tilesetTileHeight = Convert.ToInt16(tileset.Attributes["tileheight"].InnerText);

            foreach(XmlNode image in tileset.ChildNodes)
            {
                imageWidth = Convert.ToInt16(image.Attributes["width"].InnerText);
                imageHeight = Convert.ToInt16(image.Attributes["height"].InnerText);
            }

            List<Tileset> tilesetList = new List<Tileset>();
            tilesetList.Add(new Tileset(firstgid, name, tilesetTileWidth, tilesetTileHeight, 
                imageWidth, imageHeight));
        }
}

但后来我遇到了一个问题,我的 XML 文档将包含几个 &lt;tileset&gt; 标签;所以逻辑上我得出结论我必须做一个循环(第一个)。

当我尝试编译和运行代码时,Visual Studios 告诉我一个 “NullReferenceException 未处理”,同时指向 foreach 循环内的第一行。

那么这里发生了什么?

Edit1:我无法阻止引用我的 XML,所以我把它放在了 pastebin:http://pastebin.com/qW967heQ

Edit2:回复使用 LINQ;我确实尝试过,但结果是我无法访问从 XML 中检索到的数据,就像我可以使用普通的 {0} 标记记录它一样,但我无法将值分配给变量。我不是很有经验,所以如果我似乎遗漏了一些明显的东西,我很抱歉。

【问题讨论】:

  • 把你的xml来帮你
  • 如果没有看到您尝试解析的数据,很难判断您的代码出了什么问题
  • 哪个foreach 循环?你有两个。另外,你使用XmlDocument吗? LINQ to XML 要简单得多。如果您可以发布 XML 示例并修复您的代码格式,那也会有所帮助。
  • 不仅如此,您还在“第一行”中塞入了太多杂乱无章的代码,以至于有几个地方可能会出现空引用异常。让我给你一个提示。不要将这么多代码塞进这样的嵌套表达式中。这使得调试变得困难。
  • 在约翰逊之前我没有想过这个问题,谢谢你的提示。但我仍然不知道如何解决这个问题。我添加了我的 XML 代码并修复了格式。

标签: c# xml parsing loops


【解决方案1】:

在 foreach 循环中,您访问 map.ChildNodes。这将返回 tileset 节点以及 layer 节点。然后,您尝试访问 layer 节点的不存在的 firstgid 属性的 InnerText 属性。

您可以使用map.SelectNodes("tileset") 来过滤tileset 节点,而不是map.ChildNodes

【讨论】:

  • 感谢您帮助我。你有什么线索我可以在哪里阅读更多关于这个的信息吗?我注意到我缺乏基础知识。
【解决方案2】:

也许对你有帮助

XmlDocument xDoc = new XmlDocument();

xDoc.Load(@"D:\Map.xml");
        parseXML(xDoc);



private void parseXML(XmlDocument xdoc) {
        try {

            var enumXMLnode = from xelement in xdoc.GetElementsByTagName("tileset").Cast<XmlElement>()
                              select xelement;
            foreach (XmlElement innerData in enumXMLnode) {
                MessageBox.Show(innerData.InnerXml);
            }
        }
        catch { 

        }
    }

【讨论】:

  • 可以直接跳转到任意节点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多