无法使用XML

时间:2017-01-10 02:43:37

标签: c# xml

我似乎无法从xml文件的子节点获取值。我觉得我已经尝试了一切。我想要的是获取xml文件中latitude子节点的longitudelocation的值。我究竟做错了什么?也许我应该尝试使用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>

此处还有一个调试值,显示计数为零。不确定那是什么意思。我只需要latlng的值。

5 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么您正在寻找XML文档中所有latlng的列表。

XDocument xdc = XDocument.Load(stream);
var AllLats = xdc.Descendants("lat");
var AllLong = xdc.Descendants("lng");

您不需要向下钻取到层次结构以获取带有Descendants的XML节点值

另一部分是ns,您的namespace必须包含在XML中,看起来像

<SOmeNS:address_component>

不适用于没有:

的名称的元素

附上截图以查看是否需要此输出。

ScreenShot

答案 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);
    }
}