2015-04-16 55 views
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; 
    } 

} 

回答

1

模式是指XSD,XML格式的架構。該錯誤評論沒有找到正確的XML。我想,默認builder.isValidating()會是真的。添加一個ErrorHandler。刪除驗證代碼並在infox中重命名信息並查看。

+0

謝謝,這有幫助。我發現的每個教程都使用了模式,或者跳過關於驗證的整個討論。 – Mandemon

相關問題