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 に答える