Reputation: 422
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;
}
}
Upvotes: 1
Views: 1730
Reputation: 109567
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.
Upvotes: 1