2012-01-10 31 views
0

我正在使用以下代碼根據指定的XML架構驗證XML文檔(.gpx)。我將模式本地存儲爲.xsd文件。問題是,這種方法使用互聯網連接來驗證架構。有沒有一種方法可以在不使用互聯網連接的情況下完成? (鑑於我在本地存儲XML模式的事實)。使用SAXParser離線驗證XML(gpx)架構

代碼:

public static boolean validate(String XmlDocumentUrl, String SchemaUrl) { 
    SAXParser parser = new SAXParser(); 
    try { 
     parser.setFeature("http://xml.org/sax/features/namespaces", true); 

     parser.setFeature("http://xml.org/sax/features/validation", true); 
     parser.setFeature(
       "http://apache.org/xml/features/validation/schema", true); 
     parser.setFeature(
       "http://apache.org/xml/features/validation/schema-full-checking", 
       false); 
     parser.setProperty(
       "http://apache.org/xml/properties/schema/external-schemaLocation", 
       SchemaUrl); 
     Validator handler = new Validator(); 

     parser.setErrorHandler(handler); 
     parser.parse(XmlDocumentUrl); 
     if (handler.validationError == true){ 
      System.out.println("XML Document has Error:" 

        + handler.validationError + "" 
        + handler.saxParseException.getMessage()); 
     return false; 
     } 
     else{ 
      System.out.println("XML Document is valid"); 
     return true; 
     } 
    } catch (java.io.IOException ioe) { 
     System.out.println("IOException" + ioe.getMessage()); 
    } catch (SAXException e) { 
     System.out.println("SAXException" + e.getMessage()); 
    } 
    return false; 
} 

感謝和問候,

斯托

回答

0

使用 「文件://」 URL引用您的本地模式。

0

指定schemaUrl"file://path/to/schema.xsd"

+0

感謝您的回答。然而,當我使用這個:parser.setProperty( \t \t \t \t \t 「http://apache.org/xml/properties/schema/external-schemaLocation」, \t \t \t \t \t 「文件://」 + SchemaUrl);問題依然存在。當我離線時它會返回錯誤 – Petar 2012-01-10 20:33:33

+0

那麼它取決於schemaUrl是什麼。它還有一個http://嗎? – Dave 2012-01-10 21:25:17

+0

不,它只是一個包含模式名稱(和路徑)的字符串。所以通過在前面添加「file://」,它應該變成「file://schema.xsd」。我在這裏錯過了什麼? – Petar 2012-01-10 22:13:23

0

同比可以通過你自己實現了DefaultHandler的:

...SAXParserFactory factory = SAXParserFactory.newInstance(); 
SAXParser saxParser = factory.newSAXParser(); 
saxParser.parse(InputSource, new Defaulthandler() { 
@Override 
      public InputSource resolveEntity(String publicId, String systemId) 
        throws IOException, SAXException { 
       InputStream is = ClassLoader.getSystemResourceAsStream("path_to_you_local_dtd_doc"); 
       return is != null ? new InputSource(is) : 
        super.resolveEntity(publicId, systemId); 
      } 
})