已回答 IEnumerable's foreach在此代码中不起作用

酒馆

新成员
已加入
2021年2月10日
留言内容
3
编程经验
1-3
大家好,我需要从XML文件(特别是KML文件)中提取坐标。我用IEnumerable搜索所有带有"coordinates"但没有任何内容可以打印出来"foreach"环形。有人可以指导我这里有什么不正确的地方吗?这是一个测试kml文件,可以帮助您: Hastebin.

C#:
            XDocument kmlDoc = XDocument.Load("Documents\\c#\\SafeFlyZone.kml");
            IEnumerable<XElement> coordinates = kmlDoc.Elements("coordinates") ;
            
            foreach (XElement c in coordinates)
            {
                Console.WriteLine(c);
                Console.WriteLine("hi");
            }
 
由主持人最后编辑:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,567
地点
悉尼,澳大利亚
编程经验
10+
Did you debug your code, i.e. set a breakpoint and step through the code? If you haven't, go back and do it. If you have, tell us what happened. If execution gets to the 前言 line but doesn't get into the loop then there's no items in the list, plain and simple.
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,612
地点
弗吉尼亚州切萨皮克
编程经验
10+
Part of the problem here is that you are using Elements() which just returns matching nodes that are direct children of the parent node. Looking at the KML file you have in hastebin, the <coordinates> node is several levels deep. Perhaps you meant to use [icodeDescendants()[/icode]?
 

酒馆

新成员
已加入
2021年2月10日
留言内容
3
编程经验
1-3
Part of the problem here is that you are using Elements() which just returns matching nodes that are direct children of the parent node. Looking at the KML file you have in hastebin, the <coordinates> node is several levels deep. Perhaps you meant to use [icodeDescendants()[/icode]?
嘿,
我更新为使用后代的代码。

C#:
           XDocument kmlDoc = XDocument.Load("C:\\Users\\ari.paterson.CGW\\Documents\\c#\\SafeFlyZone.kml");
            IEnumerable<XElement>坐标= kmlDoc.Descendants() ;
         
            foreach (XElement c in coordinates)
            {
                Console.WriteLine(c);
            }
问题是,如果我指定"coordinates"Descendants参数中的标记,即将行更改为此:IEnumerable<XElement>坐标= kmlDoc.Descendants("coordinates") ;
那么foreach循环不会显示任何内容。
 
Last edited:

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,612
地点
弗吉尼亚州切萨皮克
编程经验
10+
回想一下,您的.KML文件使用XML命名空间,因此您需要对使用命名空间传递的XName进行限定。

无论如何,以下代码对我有用:
C#:
var xdoc = XDocument.Load("SafeFlyZone.kml");
var coordinates = xdoc.Descendants("{http://www.opengis.net/kml/2.2}coordinates");
foreach(var c in coordinates)
    Console.WriteLine(c);
 

酒馆

新成员
已加入
2021年2月10日
留言内容
3
编程经验
1-3
回想一下,您的.KML文件使用XML命名空间,因此您需要对使用命名空间传递的XName进行限定。

无论如何,以下代码对我有用:
C#:
var xdoc = XDocument.Load("SafeFlyZone.kml");
var coordinates = xdoc.Descendants("{http://www.opengis.net/kml/2.2}coordinates");
foreach(var c in coordinates)
    Console.WriteLine(c);
谢谢你。现在已经正确读取了,我需要为每个坐标提取纬度,经度和海拔高度。我有一个具有这些属性的Coordinate类。正如您在该KML文件中看到的那样,每个点的所有纬度,经度和海拔高度都在一个坐标标记(基本上所有的坐标点一起包含一个封闭的坐标点)中被连续列出。"area")。您如何建议我为每个坐标提取这3个属性?我想提高效率
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,612
地点
弗吉尼亚州切萨皮克
编程经验
10+
对于那些在家玩耍而又不想打扰hastebin的人(或其公司防火墙阻止了对hastebin的访问):
XML:
<coordinates>
  -81.63342996909985,26.00624888622895,5.511072327176461 -81.69436462186725,26.00111266059973,5.775688596799045 -81.72714274216864,25.97200771522702,5.891206165085467 -81.74804280929955,25.89820713561373,5.516336686554482 -81.7194878797953,25.86969159426276,5.406925156662283 -81.68777978463756,25.8678037174685,5.565123116987332 -81.64888892173191,25.89234574717341,5.847666518438936 -81.65501830196251,25.90413728541918,5.577885344879334 -81.67890577689818,25.90698854943053,5.376601784872362 -81.69497545624714,25.92429045472441,6.031950330691663 -81.62838022283984,25.91364075147099,5.399419633485818 -81.60404574616953,25.9581287386885,5.715948449035759 -81.63342996909985,26.00624888622895,5.511072327176461
</coordinates>

Personally, if I were not concerned about efficiency, I would split the InnerText value by spaces first to get each group of X,Y,Z values, and then for each group split by commas to get each X, Y, Z value and then parse the floating point values into properties of the Coordinate class. I would ignore the cost of allocating all the arrays and strings created by each parsing process, and the overhead of using a class instead of struct.

If I were concerned about efficiency, I would first ensure that the Coordinate class is converted to a Coordinate struct. Next, I would write a custom parser that would parse the string from left to write consuming the X, Y, Z values as it encounters them and spits out Coordinate structs as each one is completely read in.
 
最佳 底部