这是XML:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<LookAt>
<longitude>51.84750492</longitude>
<latitude>61.85536484</latitude>
<range>4423610</range>
</LookAt>
<Style id="Filled_Label">
</Style>
</Document>
</kml>
这是代码:
XElement doc = XElement.Load("/kml/MyFile2.kml");
XNamespace ns = XNamespace.Get("http://www.opengis.new/kml/2.2");
var query = from x in doc.Elements(ns + "longitude")
select x;
Response.Write(query.Count());
foreach (XElement item in query)
{
Response.Write(item.Value);
}
但它确实没有打印(0个元素)。 我哪里错了?
答案 0 :(得分:2)
我在您发布的代码中看到了两个问题。
XNamespace ns = XNamespace.Get("http://www.opengis.new/kml/2.2");
在这一行,当我怀疑你是...opengis.new
时,你有...opengis.net
。轻松修复。
XNamespace ns = XNamespace.Get("http://www.opengis.net/kml/2.2");
var query = from x in doc.Elements(ns + "longitude")
select x;
据我所知,当您需要Descendants
时,您正在使用Elements
。 Elements()
仅查看节点的直接子节点,因此在您的情况下,只会查找Documents
,并发现您的参数不匹配。
将其更改为,
var query = from x in doc.Descendants(ns + "longitude")
select x;
它应该有用。
当然,我倾向于使用一系列Elements
次调用,因为Descendants
会产生一些令人讨厌的副作用。显然,它将使用该名称的任何元素,因此它将返回模式中出现的任何元素,无论它们是否是您想要的。所以这真的取决于你在寻找什么。
答案 1 :(得分:0)
正如collaspar已经提到的,你的命名空间中有一个拼写错误:
XNamespace ns = XNamespace.Get("http://www.opengis.net/kml/2.2");
您还应该使用XElement.Descendants
获取经度:
XElement doc = XElement.Load("/kml/MyFile2.kml");
XNamespace ns = XNamespace.Get("http://www.opengis.net/kml/2.2");
var query = doc.Descendants(ns + "longitude").Select(x => x);
如果您想要元素的值,可以使用:
var values = query.Select(x => x.Value);
答案 2 :(得分:0)
XElement doc = XElement.Load("/kml/MyFile2.kml")
XNamespace ns = XNamespace.Get("http://www.opengis.net/kml/2.2");
var query = doc.Descendants(ns + "longitude");
//from x in doc.Elements(ns + "longitude")
// select x;
// Response.Write(query.Count());
foreach (XElement item in query)
{
// Response.Write(item.Value);
}