0

我正在寻找一种方法来根据内部架构验证我的 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 实例,它有一个属性,我可以在解析完成后获取它,但这对我来说听起来并不酷:)

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

4

2 回答 2

1

是的,您想使用自定义 ErrorHandler 来跟踪是否遇到错误(不确定您认为这听起来“不酷”)。

至于“验证”与“解析”,您如何期望在不解析的情况下验证文档?

于 2013-08-05T16:35:13.347 回答
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 错误处理程序

于 2013-08-05T17:50:54.903 回答