docs: def read(source, chatty=True, stop=None):
      """
      Convert a NRML file into a validated Node object. Keeps
      the entire tree in memory.
  
      :param source:
          a file name or file object open for reading
      """
      vparser = ValidatingXmlParser(validators, stop)
      nrml = vparser.parse_file(source)
      if striptag(nrml.tag) != 'nrml':
          raise ValueError('%s: expected a node of kind nrml, got %s' %
                           (source, nrml.tag))
      # extract the XML namespace URL ('http://openquake.org/xmlns/nrml/0.5')
      xmlns = nrml.tag.split('}')[0][1:]
      if xmlns != NRML05 and chatty:
          # for the moment NRML04 is still supported, so we hide the warning
          logging.debug('%s is at an outdated version: %s', source, xmlns)
      nrml['xmlns'] = xmlns
      nrml['xmlns:gml'] = GML_NAMESPACE
      return nrml