简体   繁体   中英

Error while validating xml: The markup in the document preceding the root element must be well-formed

So I am creating a java program that reads and validates XML file, then carries out actions for it. I got the XML file parsed, but when I try to validate I keep getting the same error.

The markup in the document preceding the root element must be well-formed.

When I ran validation outside my code on the XML files, everything checks out but when I run it in my code, I keep getting error.

The XML:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE company SYSTEM "Company.dtd">
<company>
    <info>
        <name>SCP Foundation</name>
        <manager>O5</manager>
        <location>Classified</location>
    </info>
    <warehouses>
        <warehouse file="Warehouse13.xml" />
    </warehouses>
    <actions>
        <action type="sort" att="decending" />
    </actions>
</company>

The DTD:

<!-- Our root element, company.-->
<!ELEMENT company (info, warehouses, actions)>

<!-- Ijfo which contains data about company. -->
<!ELEMENT info      (name,  manager, location)>

<!ELEMENT name      (#PCDATA)>
<!ELEMENT manager   (#PCDATA)>
<!ELEMENT location  (#PCDATA)>

<!-- Inbound are objects stated to arrive -->
<!ELEMENT warehouses    ( warehouse+ )>

<!ELEMENT warehouse EMPTY >
<!ATTLIST warehouse file CDATA #REQUIRED >

<!-- Our actions, if the program is upgraded, this can easily be expanded -->
<!ELEMENT actions   ( action* )>

<!ELEMENT action    EMPTY>
<!ATTLIST action type CDATA #REQUIRED >
<!ATTLIST action att  CDATA #REQUIRED >

The code:

public class XMLHandler {

    private DocumentBuilderFactory factory;
    private DocumentBuilder builder;
    private boolean debug;

    public XMLHandler(boolean debug)
    {
        this.debug = debug;

        factory = DocumentBuilderFactory.newInstance();

        factory.setValidating(true);

        try 
        {
            builder = factory.newDocumentBuilder();

        } catch (ParserConfigurationException e) {
            System.out.println("ERROR: Error while creating XML handler");
            System.out.println( e.toString() );
            System.exit(5);
            return;
        }


    }

    public boolean validateDTD(Document xml, String dtd)
    {

         if(debug)
        {
             System.out.println("DEBUG: Starting validation using " + dtd + " DTD file");
        }

        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Source schemaFile = new StreamSource(new File(dtd));
        Schema schema;

        if(debug)
        {
            System.out.println("DEBUG: Getting the DTD");
        }

        //TODO Figure out what goes wrong here

        try {
            schema = factory.newSchema(schemaFile);
        } catch (SAXException e) {
            System.out.println("DEBUG: Error while handling the DTD");
            e.printStackTrace();
            return false;
        }
        Validator validator = schema.newValidator();

        if(debug)
        {
            System.out.println("DEBUG: Validating xml file");
        }

        try {
            validator.validate(new DOMSource(xml));
            System.out.println("DEBUG: XML file is valid");
        } catch (SAXException e) {
            System.out.println("ERROR: SAXException");
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            System.out.println("ERROR: IOException");
            e.printStackTrace();
            return false;
        }


        return true;
    }

    public Document parseDocument(String xmlFile, String type)
    {
        if(debug)
        {
            System.out.println("DEBUG: Begining parsing operation for file " + xmlFile);
        }

        File xmlSource = new File(xmlFile);

        if(!xmlSource.isFile())
        {
            System.out.println("ERROR: Given source file is not an actual file");
            System.exit(6);
        }


        Document doc = null;

        if(debug)
        {
            System.out.println("DEBUG: Creating document");
        }


        //We attempt to create the document
        try 
        {
            doc = builder.parse(xmlSource);
        } catch (SAXException e) 
        {
            System.out.println("ERROR: XML parser error");
            e.printStackTrace();
            doc = null;
            System.exit(7);

        } catch (IOException e) 
        {
            System.out.println("ERROR: IO failure while parsing the document");
            e.printStackTrace();
            doc = null;
            System.exit(7);
        }

        if(debug)
        {
            System.out.println("DEBUG: File parsed, moving to validation");
        }
        //TODO Fix validation

        String dtd = "Warehouse.dtd";

        if(type.equals("Company"))
        {
            dtd = "Company.dtd";
        }


        if( !validateDTD( doc, dtd) )
        {
            System.out.println("ERROR: XML file is not a valid" );
            System.exit(8);
        }

        return doc;
    }

}

Schema refers to XSD, the schema in XML format. The error comments on not finding correct XML.

Per default builder.isValidating() will be true I guess. Add an ErrorHandler. Leave out the validating code and rename info in infox or so and see.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM