KML 到 ASP.NET 的转换






1.60/5 (3投票s)
一篇文章,介绍如何使用 C# 在 ASP.NET 中集成 Keyhole Markup Language (KML) 文档。
引言
在这个例子中,演示了如何使用 C# 在 ASP.NET 中集成 Keyhole Markup Language KML 文档。Google 地图将此文档作为用户发送的 HTTP 请求的结果返回,其中包含方向和距离的数据。您将在代码中看到实现和转换。我使用了 LINQ,它允许使用标准查询运算符以及树特定的运算符来查询 XML 数据,从而提供类似于 XPath 的导航,遍历后代、祖先和同级节点。它简化了使用 XML 数据,而无需诉诸使用额外的语言语法,如 XPath 或 XQuery。您可以使用 LINQ to XML 对从文件系统、远程 Web 服务或内存 XML 内容检索到的 XML 执行 LINQ 查询。
Using the Code
首先,我们将添加我们将使用的命名空间。我们的代码后台将如下所示
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System .Xml ;
Line 1: XNamespace obj_XNameSpace = XNamespace.Get("http://earth.google.com/kml/2.0");
Line 2: string Des_Source_URL = "http://maps.google.com/?q=From " +
from_text + " to " +
to_text + "&output=kml&view=text";
在深入细节之前,有一些需要记住的要点
XNamespace
("http://earth.google.com/kml/2.0") 这将作为命名空间,我们将使用它来解析指定 Uniform Resource Identifier 的 KML。- 浏览器查询 www.maps.google.com/?q=from "from_address" to "to_address" "&output=kml&view=text"; (其中 "from" 和 "to" 是关键词)
- “output” 参数以给定的格式检索结果,在本例中将是 KML。
提示:如果您在浏览器 URL 窗口中键入步骤 2 中的查询,将出现文件下载对话框,并要求您保存文件。
这段代码非常简单直接。如果您熟悉 LINQ,那么我相信您可以做更多深入的事情。现在这只是一个基本的示例,我创建了一个用户控件,主要由两个文本框、按钮和一个网格视图组成。我使用 ScriptManager
来实现 AJAX 功能,以提高性能并减少回发。
在以下 LINQ 查询中,我将加载 "Placemark" 的所有后代元素,作为 Xelement 对象存储在 IEnumerable<Xelement> 中,如图 2 所示。我需要获取仅 Placemark(name,description) 而不包含 StyleMap, Point, LookAt (PlaceMark) 的信息。我使用以下代码,但由于所有节点都是“Node”,我获取了所有级别的后代。我想将其限制为仅一个级别。
"IEnumerable<XElement>nodes =
from n in Des_Source_document.Descendants(obj_XNameSpace + "Placemark")select n;"
Xdocument.Descendants()
返回此文档或元素的后代元素的集合,按文档顺序排列。
var Select_Name_Doc = from n in nodes where ((from x in n.Descendants(obj_XNameSpace
+ "name") select x).Count() > 0) && ((from y in n.Descendants(obj_XNameSpace
+ "description") select y).Count() > 0) select n;
在这个 LINQ 查询中,我获取所需节点的值,即 "name" 和 "description"。请确保 XML 是区分大小写的,因此 Xname
应与图 2 中显示的格式完全相同。
foreach (var node in Select_Name_Doc)
{
DataRow dr = obj_datatble.NewRow();
dr["Value"] = node.Descendants(obj_XNameSpace + "name").First().Value;
dr["Distance"] = node.Descendants(obj_XNameSpace +
"description").First().Value;
obj_datatble.Rows.Add(dr);
}
GridView1.DataSource = obj_datatble;
GridView1.DataBind();
在将所有值获取到 Select_Name_Doc
后,我声明一个自定义 DataTable
,其中包含两行 "value
" 和 "distance
",然后将每个节点的值存储在这些行中,并在 foreach
循环中将其添加到 DataTable
中。完成添加行后,我将 DataTable
分配给 GridView
作为 DataSource
,然后绑定 datagrid
。
历史
- 2010 年 1 月 28 日:初始发布