2013-08-05 89 views
0

我正在寻找一种方法来根据内部模式验证我的XML文件。目前这是我的代码。使用内部架构验证XML返回一个布尔值

final SAXParserFactory factory = SAXParserFactory.newInstance(); 
factory.setValidating(true); 
factory.setNamespaceAware(true); 

SAXParser parser; 
parser = factory.newSAXParser(); 
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", 
    "http://www.w3.org/2001/XMLSchema"); 

final XMLReader reader = parser.getXMLReader(); 
reader.setErrorHandler(new SAXErrorHandler()); 
reader.parse(new InputSource(doc)); 

那么它的作用是报告验证错误,如果它是非致命错误和解析可以继续警告。这很好,因为我可以看到更多的错误,如果它只是打破并引发异常。

但是它不确实正在代码中的可用信息给我,让我可以有一个方法boolean validate()返回是否存在或不存在错误(警告)

所以我想到了一个自己的实例ErrorHandler的属性,我可以抢在解析完成后,但这听起来对我来说并不酷:)

接下来的事情是解析这样的解析需要一些时间,只需使用验证器可以显着更快(和是这是时间关键;)),但因为我需要内部模式进行验证,所以我不知道如何完全解析。

回答

1

是的,你想使用一个自定义ErrorHandler来跟踪是否遇到错误(不知道你认为听起来“不酷”)。

至于“验证”与“解析”,你如何期待验证一个文件而不解析它?

+0

我经过这里的SO各种问题,所有建议哪些需要外接方案Validator类阅读。也许我错了,但我认为Validator并不像解析器那样构建完整的DOM树,因此速度更快。 我希望能找到比自定义的ErrorHandler更流畅的东西,但我会试一试;)。感谢您的回答。 –

+0

@DennisIch - SAX解析器根本不构建DOM树。它所做的只是将事件传递给处理程序。 – jtahlborn

+0

很高兴知道,谢谢你在这里的帮助。 –

0
public static boolean validate(String xml) 
    throws ParserConfigurationException, IOException { 
    try { 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     factory.setValidating(true); 
     factory.setNamespaceAware(true); 

     SAXParser parser = factory.newSAXParser(); 

     XMLReader reader = parser.getXMLReader(); 
     // custom error handler 
     // ignore warning, throw on error and fatal 
     // (we will catch later to return false!) 
     reader.setErrorHandler(
      new ErrorHandler() { 
      public void warning(SAXParseException e) throws SAXException { 
       System.out.println("WARNING : " + e.getMessage()); // do nothing 
      } 

      public void error(SAXParseException e) throws SAXException { 
       System.out.println("ERROR : " + e.getMessage()); 
       throw e; 
      } 

      public void fatalError(SAXParseException e) throws SAXException { 
       System.out.println("FATAL : " + e.getMessage()); 
       throw e; 
      } 
      } 
     ); 
     reader.parse(new InputSource(xml)); 
     return true; 
    } 
    catch (ParserConfigurationException pce) { 
     throw pce; 
    } 
    catch (IOException io) { 
     throw io; 
    } 
    catch (SAXException se){ 
     return false; 
    } 
    } 

SAX ErrorHandler

+0

那么SAXErrorHandler确实如此,但这也不会捕获警告,如果我抛出警告解析停止,但我希望所有警告被记录;)。 –

+0

嗯...这取决于你自定义警告处理。添加到SAX ErrorHandler Javadoc的链接。 – RealHowTo