C# 用XmlDocument解析XML

C# 用XmlDocument解析XML,c#,xml,parsing,loops,C#,Xml,Parsing,Loops,因此,我尝试使用XmlDocument类在C#中解析XML文档。到目前为止,我已经成功地从名为的第一个节点加载了数据 public void read() { XmlDocument doc=新的XmlDocument(); doc.Load(“C:\\map.xml”); 解析图(doc); } 私有文档(XmlDocument文档) { XmlNode map=doc.DocumentElement.SelectSingleNode(“/map”); int mapWidth=Convert

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

public void read()
{
XmlDocument doc=新的XmlDocument();
doc.Load(“C:\\map.xml”);
解析图(doc);
}
私有文档(XmlDocument文档)
{
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);
控制台。写入(“贴图宽度:+mapWidth+”\n贴图高度:+mapHeight+
“\n分幅宽度:“+tileWidth+”\n分幅高度:“+tileHeight”;
int tileSetCount=map.SelectNodes(“tileset”).Count;
控制台。写入(“\n tilesets计数:“+tilesetsCount”);
foreach(map.ChildNodes中的XmlNode tileset)
{
int firstgid=Convert.ToInt16(tileset.Attributes[“firstgid”].InnerText);
string name=tileset.Attributes[“name”].InnerText;
int tileSettleWidth=Convert.ToInt16(tileset.Attributes[“tilewidth”].InnerText);
int-tileSettleLight=Convert.ToInt16(tileset.Attributes[“tileheight”].InnerText);
foreach(tileset.ChildNodes中的XmlNode图像)
{
imageWidth=Convert.ToInt16(image.Attributes[“width”].InnerText);
imageHeight=Convert.ToInt16(image.Attributes[“height”].InnerText);
}
List tilesetList=新列表();
添加(新的Tileset(第一个GID、名称、TILESETTTILEWITH、TILESETILHEIGHT、,
图像宽度、图像高度);
}
}
但是我遇到了一个问题,我的XML文档将包含几个
标记;所以从逻辑上来说,我得出结论,我必须做一个循环(第一个循环)

当我尝试编译和运行代码时,visual Studio告诉我,当指向foreach循环中的第一行时,“NullReferenceException未处理”

这是怎么回事

Edit1:我无法阻止引用我的XML,所以我将其放在pastebin上:


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

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


您可以使用
map.ChildNodes
而不是
map.SelectNodes(“tileset”)
来筛选
tileset
节点。

这对您有帮助吗

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 { 

        }
    }
XmlDocument xDoc=new XmlDocument();
Load(@“D:\Map.xml”);
parseXML(xDoc);
私有void解析XML(XmlDocument xdoc){
试一试{
var enumXMLnode=来自xdoc.GetElementsByTagName(“tileset”).Cast()中的xelement
选择xelement;
foreach(enumXMLnode中的XmlElement innerData){
Show(innerData.InnerXml);
}
}
捕获{
}
}

使用xml来帮助您如果不看到您试图解析的数据,就很难判断代码有什么问题,哪一个
foreach
循环?你有两个。另外,您是否必须使用
XmlDocument
?LINQ到XML要简单得多。如果你能发布一个XML样本并修正你的代码格式,那也会有帮助。不仅如此,你在“第一行”中塞进了太多的危险代码,以至于有好几个地方可能会出现空引用异常。让我给你小费。不要像那样在嵌套表达式中塞进那么多代码。这使得调试变得很困难。我以前没有考虑过这一点,约翰逊,谢谢你的提示。但我仍然不知道如何解决这个问题。我添加了我的XML代码并修复了格式。感谢您的帮助。你知道我在哪里可以读到更多关于这个的信息吗?我注意到我缺乏基础知识,你可以直接跳到任何节点
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 { 

        }
    }