def import_locations(self, gpx_file):
        """Import GPX data files.

        ``import_locations()`` returns a list with :class:`~gpx.Waypoint`
        objects.

        It expects data files in GPX format, as specified in `GPX 1.1 Schema
        Documentation`_, which is XML such as::

            <?xml version="1.0" encoding="utf-8" standalone="no"?>
            <gpx version="1.1" creator="PocketGPSWorld.com"
            xmlns="http://www.topografix.com/GPX/1/1"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">

              <wpt lat="52.015" lon="-0.221">
                <name>Home</name>
                <desc>My place</desc>
              </wpt>
              <wpt lat="52.167" lon="0.390">
                <name>MSR</name>
                <desc>Microsoft Research, Cambridge</desc>
              </wpt>
            </gpx>

        The reader uses the :mod:`ElementTree` module, so should be very fast
        when importing data.  The above file processed by
        ``import_locations()`` will return the following ``list`` object::

            [Waypoint(52.015, -0.221, "Home", "My place"),
             Waypoint(52.167, 0.390, "MSR", "Microsoft Research, Cambridge")]

        Args:
            gpx_file (iter): GPX data to read

        Returns:
            list: Locations with optional comments

        .. _GPX 1.1 Schema Documentation: http://www.topografix.com/GPX/1/1/
        """
        self._gpx_file = gpx_file
        data = utils.prepare_xml_read(gpx_file, objectify=True)

        try:
            self.metadata.import_metadata(data.metadata)
        except AttributeError:
            pass

        for waypoint in data.wpt:
            latitude = waypoint.get('lat')
            longitude = waypoint.get('lon')
            try:
                name = waypoint.name.text
            except AttributeError:
                name = None
            try:
                description = waypoint.desc.text
            except AttributeError:
                description = None
            try:
                elevation = float(waypoint.ele.text)
            except AttributeError:
                elevation = None
            try:
                time = utils.Timestamp.parse_isoformat(waypoint.time.text)
            except AttributeError:
                time = None
            self.append(Waypoint(latitude, longitude, name, description,
                                 elevation, time))