public static MVD internalise( File src ) throws Exception
	{
		// use DOM3 to parse
		DOMImplementationRegistry registry 
			= DOMImplementationRegistry.newInstance();
		DOMImplementationLS impl = 
		    (DOMImplementationLS)registry.getDOMImplementation("LS");
		LSParser parser = impl.createLSParser(
			DOMImplementationLS.MODE_SYNCHRONOUS, null );
		DOMConfiguration config = parser.getDomConfig();
		// don't preserve entities: so &lt; becomes <
		config.setParameter( "entities", false );
		LSInput input = impl.createLSInput();
		input.setByteStream( new FileInputStream(src) );
		Document document = parser.parse( input );
		// get the "mvd" element
		Element root = document.getDocumentElement();
		String description = root.getAttribute("description");
		if ( description == null )
			description = "";
		String encoding = root.getAttribute("encoding");
		if ( encoding == null )
			encoding = "UTF-8";
		MVD mvd = new MVD( description );
		NodeList nl = root.getChildNodes();
		for ( int i=0;i<nl.getLength();i++ )
		{
			Node topLevelNode = nl.item( i );
			if ( topLevelNode.getNodeType() == Node.ELEMENT_NODE )
			{
				String name = topLevelNode.getNodeName();
				if ( name.equals("groups") )
					readGroups( (Element)topLevelNode, mvd );
				else if ( name.equals("versions") )
					readVersions( (Element)topLevelNode, mvd );
				else if ( name.equals("pairs") )
					readPairs( (Element)topLevelNode, mvd, encoding );
			}
		}
		return mvd;
	}