验证xml时出错:根元素之前的文档中的标记必须格式正确

时间:2015-04-16 08:48:05

标签: java xml xml-parsing

所以我创建了一个java程序来读取和验证XML文件,然后为它执行操作。我解析了XML文件,但是当我尝试验证时,我仍然遇到同样的错误。

  

根元素之前的文档中的标记必须是   良好的。

当我在XML文件的代码之外运行验证时,所有内容都会检出,但是当我在代码中运行它时,我一直都会收到错误。

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>

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 >

代码:

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;
    }

}

1 个答案:

答案 0 :(得分:1)

Schema是指XSD,XML格式的模式。错误评论未找到正确的XML。

我认为默认builder.isValidating()是正确的。添加ErrorHandler。省略验证码并在infox中重命名信息,然后查看。