我正在使用.NET 2.0,需要在这里实现VAR数据类型:
var doc = XDocument.Parse(result);
var sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
if (sw != null)
{
var lat = (double)sw.Element("lat");
var lng = (double)sw.Element("lng");
// do stuff
}
我改用字符串
public string getLatLang(string address)
{
string latlang = "";
string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
System.Net.WebClient client = new System.Net.WebClient();
string result = client.DownloadString(url);
string doc = System.Xml.Linq.XDocument.Parse(result).ToString();
string sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
if (sw != null)
{
string lat = (double)sw.Element("lat");
string lng = (double)sw.Element("lng");
latlang = lat + "," + lang;
// do stuff
}
return latlang;
}
但是我收到一个错误:
"字符串"不包含"后代"的定义
请帮我在这里更换VAR
。
若要替换 var,请研究方法的实际返回类型并将其更改为该返回类型。 例如,XDocument.Parse可以在MSDN上找到,在文档中,它指出"从字符串创建新的XDocument",因此,返回类型必须是XDocument。 如果你向下钻取到其中一个方法重载(像这个),你会看到实际方法的签名,它确认它确实返回了XDocument。
此外,Visual Studio具有智能感知功能,因此,如果您将鼠标悬停在某物上,通常可以获得有关它的详细信息。 尝试键入 System.Xml.Linq.XDocument.Parse(
,当您键入第一个括号时,您应该会在 Visual Studio 中看到一个弹出窗口,告诉您正在使用的方法的返回类型是什么。 如果智能感知不起作用,请检查以确保您具有对 DLL 的引用。
另请注意,Visual Studio具有所谓的Object Explorer
。 这将允许您查看正在使用的每个对象的方法签名,其中包括返回类型。 只需右键单击任何对象或方法,然后选择"转到定义"。 希望你正在使用的Visual Studio版本有这个,如果没有,请考虑升级,因为它非常有用。
public string getLatLang(string address)
{
string latlang = "";
string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
System.Net.WebClient client = new System.Net.WebClient();
string result = client.DownloadString(url);
XDocument doc = System.Xml.Linq.XDocument.Parse(result);
XElement sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
if (sw != null)
{
string lat = sw.Element("lat").Value;
string lng = sw.Element("lng").Value;
latlang = String.Format("{0},{1}", lat, lng);
// do stuff
}
return latlang;
}
编辑:请注意,由于LINQ和重新分发System.Core违反EULA,如果没有一些黑客攻击,此解决方案将无法在.NET 2.0中工作,因此您可能需要将XDocument更改为XmlDocument并弄清楚如何将其与Google的返回值集成。 我相信它有一个 Load 方法或 LoadXml 方法,不记得哪个方法做哪个。
不是一种数据类型,它只是从相等运算符的另一端获取数据类型。 在此处
阅读更多相关信息
字符串替换每个 var 将无济于事,如果您不能使用var
,则必须使用正确的数据类型而不是var
。
您情况下的错误是起源的,因为我认为在这一行string doc = System.Xml.Linq.XDocument.Parse(result).ToString();
在替换 var 时您应该使用 XDocument
但相反,您使用了string
来适应使用ToString()
函数的错误。
编辑:- 评论
后
public string getLatLang(string address)
{
string latlang = "";
string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
System.Net.WebClient client = new System.Net.WebClient();
string result = client.DownloadString(url);
XDocument doc = System.Xml.Linq.XDocument.Parse(result);
XElement sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
if (sw != null)
{
string lat = (double)sw.Element("lat").Value;
string lng = (double)sw.Element("lng").Value;
latlang = lat + "," + lang;
// do stuff
}
return latlang;
}
var
关键字用于隐式键入变量。 您让编译器推断变量的类型。 但在幕后,一旦编译发生,变量仍然被分配特定的类型。
你做错了什么,就是XDocument
上叫.ToString()
。 现在你只有一个大字符串,你试图把它当作一个XDocument
。
试试这个。
XDocument doc = System.Xml.Linq.XDocument.Parse(result);
XElement = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
编辑
终于走到了一台装有Visual Studio的电脑前。 你还有一些问题。
以下内容将在 .NET 3.5+ 中编译。
public string getLatLang(string address)
{
string latlang = "";
string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
System.Net.WebClient client = new System.Net.WebClient();
string result = client.DownloadString(url);
XDocument doc = System.Xml.Linq.XDocument.Parse(result);
XElement sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
if (sw != null)
{
string lat = sw.Element("lat").ToString();
string lng = sw.Element("lng").ToString();
latlang = lat + "," + lng;
// do stuff
}
return latlang;
}
(请注意,您后来将值显式强制转换为 double
,并且仍然将其类型定义为 string
)。
至于你在评论中提到的错误,我不确定...Elements<T>(IEnumerable<T>, XName)
成员包含在 System.Xml.Linq
(MSDN) 的扩展类中,因此它应该可以工作。 确保还已将 System.Linq
指令包含在其他 using
指令中:
using System.Linq;
顺便说一句,我实际上看不出您编写的许多代码在 .NET 2.0 中如何工作。 System.Xml.Linq
和 System.Linq
命名空间直到 .NET 3.5 才引入。 如果确实使用的是 .NET 2.0,则可能需要引用此线程来解决此问题,以获取所用框架版本的解决方法。
好的,现在我尝试了 .NET 2.0 的所有可能,我想出了这个解决方案,我知道这是非常低级编码,但这是 2.0 唯一可能的解决方案,这非常适合 .NET 2.0
!public string getLatLang(string address)
{
string latlang = "";
string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
System.Net.WebClient client = new System.Net.WebClient();
string result = client.DownloadString(url);
int firstlat = result.IndexOf("<lat>");
int lastlat = result.IndexOf("</lat>");
int firstlng = result.IndexOf("<lng>");
int lastlng = result.IndexOf("</lng>");
string _latitude = result.Substring(firstlat+5, (lastlat-5) - firstlat);
string _longitude = result.Substring(firstlng+5, (lastlng-5) - firstlng);
latlang = _latitude + "," + _longitude;
return latlang;
}