2012-01-10 6 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

+0

それはどのようなschemaUrlが依存するかによって異なります。まだhttp://が入っていますか? – Dave

+0

いいえ、それはスキーマの名前(およびパス)を含む単なるStringです。したがって、 "file://"を先頭に追加すると、 "file://schema.xsd"になります。私はここで何が欠けていますか? – Petar

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); 
      } 
}) 
関連する問題