docs: def _read_services(self):
          """
          Read the control XML file and populate self.services with a list of
          services in the form of Service class instances.
          """
          # The double slash in the XPath is deliberate, as services can be
          # listed in two places (Section 2.3 of uPNP device architecture v1.1)
          for node in self._findall('device//serviceList/service'):
              findtext = partial(node.findtext, namespaces=self._root_xml.nsmap)
              svc = Service(
                  self,
                  self._url_base,
                  findtext('serviceType'),
                  findtext('serviceId'),
                  findtext('controlURL'),
                  findtext('SCPDURL'),
                  findtext('eventSubURL')
              )
              self._log.debug(
                  '%s: Service %r at %r', self.device_name, svc.service_type, svc.scpd_url)
              self.services.append(svc)
              self.service_map[svc.name] = svc