Skip to main content
`Ctrl`+`K`

# Source code for astropy.utils.xml.validate

    # Licensed under a 3-clause BSD style license - see LICENSE.rst

    """
    Functions to do XML schema and DTD validation.  At the moment, this
    makes a subprocess call to xmllint.  This could use a Python-based
    library at some point in the future, if something appropriate could be
    found.
    """

    import os
    import subprocess
    from signal import Signals

    def validate_schema(filename, schema_file):
        """
        Validates an XML file against a schema or DTD.

        Parameters
        ----------
        filename : str
            The path to the XML file to validate

        schema_file : str
            The path to the XML schema or DTD

        Returns
        -------
        returncode, stdout, stderr : int, str, str
            Returns the returncode from xmllint and the stdout and stderr
            as strings
        """
        base, ext = os.path.splitext(schema_file)
        if ext == ".xsd":
            schema_part = "--schema"
        elif ext == ".dtd":
            schema_part = "--dtdvalid"
        else:
            raise TypeError("schema_file must be a path to an XML Schema or DTD")

        p = subprocess.Popen(
            ["xmllint", "--noout", "--nonet", schema_part, schema_file, filename],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        )
        stdout, stderr = p.communicate()

        if p.returncode == 127:
            raise OSError("xmllint not found, so can not validate schema")
        elif p.returncode < 0:
            raise OSError(
                f"xmllint was terminated by signal '{Signals(-p.returncode).name}'"
            )

        return p.returncode, stdout, stderr