解析Google Maps GeocodeResponse XML并提取值

时间:2016-11-28 04:33:24

标签: c# visual-studio google-maps-api-3 xml-parsing

我正在向GoogleMaps API发出http请求,下面列出了我回来的XML。

我试图将LAT和LON值分配给字符串,但我得到了一个"空引用异常"你调用的对象是空的。在线"字符串lat = childnode ...

我的尝试是基于question/answer

当我查看调试器中的nodeList时,XML中的所有细节都在结果视图中。

任何想法我做错了什么?

以下是问题代码。

// Parse the XML
XmlDocument doc = new XmlDocument();
doc.LoadXml(responseFromServer);

XmlNodeList nodeList = doc.SelectNodes("/*[local-name() = 'GeocodeResponse']/*[local-name() = 'result']");

if (nodeList != null)
{
    foreach (XmlNode childNode in nodeList)
    {
        string lat = childNode.SelectSingleNode("//*[local-name() = 'geometry/location/lat']").InnerText;
        string lon = childNode.SelectSingleNode("//*[local-name() = 'geometry/location/lon']").InnerText;
        string locationType = childNode.SelectSingleNode("//*[local-name() = 'geometry/location_type']").InnerText;
    }
}

以下是Google Maps Returns

的XML示例

改变地址以保护无辜者:)

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<GeocodeResponse>
 <status>OK</status>
 <result>
    <type>street_address</type>
    <formatted_address>48 Johnson Ave, Wiley Park NSW 2195, Australia</formatted_address>
    <address_component>
        <long_name>48</long_name>
        <short_name>48</short_name>
        <type>street_number</type>
    </address_component>
    <address_component>
        <long_name>Johnson Avenue</long_name>
        <short_name>Johnson Ave</short_name>
        <type>route</type>
        </address_component>
    <address_component>
        <long_name>Wiley Park</long_name>
        <short_name>Wiley Park</short_name>
        <type>locality</type>
        <type>political</type>
    </address_component>
    <address_component>
        <long_name>Canterbury City Council</long_name>
        <short_name>Canterbury</short_name>
        <type>administrative_area_level_2</type>
        <type>political</type>
    </address_component>
    <address_component>
        <long_name>New South Wales</long_name>
        <short_name>NSW</short_name>
        <type>administrative_area_level_1</type>
        <type>political</type>
    </address_component>
    <address_component>
        <long_name>Australia</long_name>
        <short_name>AU</short_name>
        <type>country</type>
        <type>political</type>
    </address_component>
    <address_component>
        <long_name>2195</long_name>
        <short_name>2195</short_name>
        <type>postal_code</type>
    </address_component>
    <geometry>
        <location>
            <lat>-33.9279554</lat>
            <lng>151.0688625</lng>
        </location>
        <location_type>ROOFTOP</location_type>
        <viewport>
            <southwest>
                <lat>-33.9293044</lat>
                <lng>151.0675135</lng>
            </southwest>
            <northeast>
                <lat>-33.9266064</lat>
                <lng>151.0702115</lng>
            </northeast>
        </viewport>
    </geometry>
    <partial_match>true</partial_match>
        <place_id>ChIJkUHpDOe7EmsRGapwFB6s9Dw</place_id>
    </result>
</GeocodeResponse>

编辑: 在我看来,我还没有指定我想要的节点的路径。 不知道我应该改变什么。

1 个答案:

答案 0 :(得分:0)

使用更简单的XPath调用:

            XmlDocument doc = new XmlDocument();
            doc.Load("google.xml");

            XmlNodeList nodeList = doc.SelectNodes("/*[local-name() = 'GeocodeResponse']/*[local-name() = 'result']");

            if (nodeList != null)
            {
                foreach (XmlNode childNode in nodeList)
                {
                    string lat = childNode.SelectSingleNode("geometry/location/lat").InnerText;
                    string lon = childNode.SelectSingleNode("geometry/location/lng").InnerText;
                    string locationType = childNode.SelectSingleNode("geometry/location_type").InnerText;
                }
            }

另外......经度节点是&#39; lgn&#39;不是lon