1
因此,我創建了一個讀取並驗證XML文件的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;
}
}
謝謝,這有幫助。我發現的每個教程都使用了模式,或者跳過關於驗證的整個討論。 – Mandemon