我似乎无法从xml文件的子节点获取值。我觉得我已经尝试了一切。我想要的是获取xml文件中latitude
子节点的longitude
和location
的值。我究竟做错了什么?也许我应该尝试使用JSON而不是XML。
private void RequestCompleted(IAsyncResult result)
{
var request = (HttpWebRequest)result.AsyncState;
var response = (HttpWebResponse)request.EndGetResponse(result);
StreamReader stream = new StreamReader(response.GetResponseStream());
try
{
XDocument xdoc = XDocument.Load(stream);
XElement root = xdoc.Root;
XNamespace ns = xdoc.Root.Name.Namespace;
List<XElement> results = xdoc.Descendants(ns + "GeocodeResponse").Descendants(ns + "result").ToList();
List<XElement> locationElement = results.Descendants(ns + "geometry").Descendants(ns + "location").ToList();
List<XElement> lat = locationElement.Descendants(ns + "lat").ToList();
List<XElement> lng = locationElement.Descendants(ns + "lng").ToList();
}
catch (Exception ex)
{
MessageBox.Show("Error" + ex.Message)
}
}
XML
<GeocodeResponse>
<status>OK</status>
<result>
<type>street_address</type>
<formatted_address>134 Gearger Circle, Lexington, KY, USA</formatted_address>
<geometry>
<location>
<lat>36.31228546</lat>
<lng>-91.4444399</lng>
</location>
<location_type>ROOFTOP</location_type>
</geometry>
<place_id>ChIJtwDV05mW-IgRyJKZ7fjmYVc</place_id>
</result>
</GeocodeResponse>
此处还有一个调试值,显示计数为零。不确定那是什么意思。我只需要lat
和lng
的值。
答案 0 :(得分:1)
如果我正确理解了您的问题,那么您正在寻找XML文档中所有lat
和lng
的列表。
XDocument xdc = XDocument.Load(stream);
var AllLats = xdc.Descendants("lat");
var AllLong = xdc.Descendants("lng");
您不需要向下钻取到层次结构以获取带有Descendants
的XML节点值
另一部分是ns
,您的namespace
必须包含在XML中,看起来像
<SOmeNS:address_component>
不适用于没有:
附上截图以查看是否需要此输出。
答案 1 :(得分:1)
按名称获取您感兴趣的元素。然后获取第一个和最后一个子节点,因为第一个子节点是lat,最后一个子节点很长。
var sw = doc.Descendants("location");
var lat = sw.Descendants().First();
var lng = sw.Descendants().Last();
答案 2 :(得分:1)
您的代码正常运行,请确保使用调试器将xml加载到行中。
XDocument xdoc = XDocument.Load(stream);
检查命名空间,执行代码时我在ns中输入空字符串或尝试从代码中删除ns。
XNamespace ns = xdoc.Root.Name.Namespace;
要在代码下方使用lat和long。
List<XElement> lat = locationElement.Descendants(ns + "lat").ToList();
List<XElement> lng = locationElement.Descendants(ns + "lng").ToList();
var latitudeval = lat[0].value;
var longitudeval = lng[0].value;
答案 3 :(得分:1)
//XNamespace ns = xdoc.Root.Name.Namespace;
XNamespace ns = xdoc.GetDefaultNamespace();
答案 4 :(得分:0)
我能够解决问题的唯一方法是发送JSON
而不是XML
的请求。然后使用Regex
我能够删除响应的<string>
部分。无论如何,这非常有效,JSON更容易使用。
private void RequestCompleted(IAsyncResult result)
{
var request = (HttpWebRequest)result.AsyncState;
var response = (HttpWebResponse)request.EndGetResponse(result);
JObject jdoc = null;
Stream stream = response.GetResponseStream();
try
{
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();
Regex rgx = new Regex("<.*\\>");
string newResult = rgx.Replace(text, "");
JObject json = JObject.Parse(newResult);
jdoc = json;
JArray results = (JArray)json["results"];
if (results.Count == 0)
{
}
else
{
foreach(JObject obj in results)
{
string formattedAddress = (string)obj["formatted_address"];
double lat = (double)obj["geometry"]["location"]["lat"];
double lng = (double)obj["geometry"]["location"]["lng"];
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error" + ex.Message);
}
}