private IEnumerable<GoogleAddress> ParseAddresses(XPathNodeIterator nodes)
{
while (nodes.MoveNext())
{
XPathNavigator nav = nodes.Current;
GoogleAddressType type = EvaluateType((string)nav.Evaluate("string(type)"));
string placeId = (string)nav.Evaluate("string(place_id)");
string formattedAddress = (string)nav.Evaluate("string(formatted_address)");
var components = ParseComponents(nav.Select("address_component")).ToArray();
double latitude = (double)nav.Evaluate("number(geometry/location/lat)");
double longitude = (double)nav.Evaluate("number(geometry/location/lng)");
Location coordinates = new Location(latitude, longitude);
double neLatitude = (double)nav.Evaluate("number(geometry/viewport/northeast/lat)");
double neLongitude = (double)nav.Evaluate("number(geometry/viewport/northeast/lng)");
Location neCoordinates = new Location(neLatitude, neLongitude);
double swLatitude = (double)nav.Evaluate("number(geometry/viewport/southwest/lat)");
double swLongitude = (double)nav.Evaluate("number(geometry/viewport/southwest/lng)");
Location swCoordinates = new Location(swLatitude, swLongitude);
var viewport = new GoogleViewport { Northeast = neCoordinates, Southwest = swCoordinates };
GoogleLocationType locationType = EvaluateLocationType((string)nav.Evaluate("string(geometry/location_type)"));
bool isPartialMatch;
bool.TryParse((string)nav.Evaluate("string(partial_match)"), out isPartialMatch);
yield return new GoogleAddress(type, formattedAddress, components, coordinates, viewport, isPartialMatch, locationType, placeId);
}
}