2011-12-01 56 views
0

我目前正在做一个XML文件,其中包括城市的“名称”,“地区”,“经纬度”和“lng”。关于C#Xml读取

这里是我的代码:

XmlDocument XmlFile = new XmlDocument(); 
try { 
    XmlFile.Load("..\\..\\liste.xml"); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Erreur" + ex.Message); 
}; 
XmlNodeList MyNodeXML = XmlFile.GetElementsByTagName("city"); 
foreach (XmlNode unNode in MyNodeXML) 
{ 
    string nomVille = unNode.Attributes[0].Value; 
    string lat = unNode.Attributes[1].Value; 
    string lng = unNode.Attributes[2].Value; 
    listeCooVilles.Add(nomVille, new PointF(float.Parse(lat), float.Parse(lng))); 
} 

凡listeCooVilles是Dictionnary。

这里是我的XML:我做了一个样本测试:

<?xml version="1.0" encoding="UTF-8"?> 
<cities> 
    <city> 
     <name>Abercorn</name> 
     <region>Montérégie</region> 
     <lat>45.032999</lat> 
     <lng>-72.663057</lng> 
    </city> 
<cities> 

我看到很多帖子做了与上述相同的StackOverflow的,但是我还是上线的IndexOutOfRange异常

string nomVille = unNode.Attributes[0].Value; 

有人可以帮忙吗?谢谢!

+0

看不到任何属性?名称/区域等是元素 –

+0

你的xml中没有属性,所以你总是会得到一个异常。你应该去找孩子的节点。 – Peter

回答

5

元素没有属性 - 只有子元素。属性是与元素相同级别的名称=值对。例如。

<?xml version="1.0" encoding="UTF-8"?> 
<cities> 
    <city name="Abercorn" region="Montérégie" lat="45.032999" lng="-72.663057" /> 
    <city name="Granby" region="Montérégie" lat="45.4" lng="-72.733333" /> 
</cites> 

嵌套元素(如你最初做),并使用属性(如你编码)是构建你的XML文档都同样有效的方式。

+0

有没有办法像我写XML一样? – user1076263

+0

当然有......看看XmlReader类:http://msdn.microsoft.com/en-us/library/cc189056(v=vs.95).aspx – Josh

3

XML样本中没有任何节点具有属性,这就是为什么集合中有null个元素。

尝试将其更改为:

<?xml version="1.0" encoding="UTF-8"?> 
<cities> 
    <city testAttr = "hello!"> 
     <name>Abercorn</name> 
     <region>Montérégie</region> 
     <lat>45.032999</lat> 
     <lng>-72.663057</lng> 
    </city> 
<cities> 

加入了testAttr应在unNode.Attributes提供有效的集合。

+0

感谢您的评论:我试过了,但它仍然会抛出异常。 – user1076263

2

您在城市标记中使用的属性,但我认为你应该使用XML元素。

5

正如我们所指出的,那些元素不是属性。您的代码需要更改为:

nomVille = unNode.Item["name"].Value 
    region = unNode.Item["region"].Value 
    lat = unNode.Item["lat"].Value 
    lng = unNode.Item["lng"].Value