为什么我不能用XElement读取这个XML值?

时间:2015-02-19 09:48:09

标签: xml linq

这是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个元素)。 我哪里错了?

3 个答案:

答案 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时,您正在使用ElementsElements()仅查看节点的直接子节点,因此在您的情况下,只会查找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);
    }