web-dev-qa-db-ja.com

JavaのXML構文検証

私は、XMLファイルの構文をチェックし、すべてのタグが閉じていること、ランダムな文字がないことなどを確認する方法を見つけようとしています。この時点で気にするのは、壊れたXMLがファイル。

私はこれらのようなSOの投稿を見てきました...

...しかし、私はXMLファイルの構造を検証したくないことに気付きました。私はXMLスキーマ(XSD)に対して検証したくない... XML構文をチェックして、それが正しいかどうかを判断したいだけです。

34
Hristo

次のコードを使用して、XMLドキュメントが整形式であるかどうかを確認できます。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);

DocumentBuilder builder = factory.newDocumentBuilder();

builder.setErrorHandler(new SimpleErrorHandler());    
// the "parse" method also validates XML, will throw an exception if misformatted
Document document = builder.parse(new InputSource("document.xml"));

上記のコードで参照されているSimpleErrorHandlerクラスは次のとおりです。

public class SimpleErrorHandler implements ErrorHandler {
    public void warning(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void error(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void fatalError(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }
}

これは、JavaでXMLを検証するためのさまざまな方法を提供する このWebサイト に由来します。このメソッドはDOMツリー全体をメモリにロードすることにも注意してください。RAMに保存する場合は、代替案のコメントを参照してください。

47
James Allardice

求めているのは、コンテンツの一部が整形式のXMLドキュメントであることを確認する方法です。これは、XMLパーサーに問題のコンテンツを解析(試行)させるだけで簡単に実行できます。問題がある場合、パーサーは例外をスローしてエラーを報告します。本当にそれ以上のものはありません。必要なのは、XMLドキュメントの解析方法を理解することだけです。

注意すべき唯一のことは、XMLパーサーであると主張する一部のライブラリは実際には適切なパーサーではなく、実際にはXMLパーサーが行う必要があることを検証しない可能性があることです(XML仕様に従って)-Javaでは、Javolutionが例ですチェックをほとんど、またはまったく行わないもの。 VTD-XMLおよびXPP3はいくつかの検証を行います(すべての必須チェックではありません)。そして、スペクトルのもう一方の端では、XercesとWoodstoxは仕様が要求するすべてをチェックします。 XercesはJDKにバンドルされています。ほとんどのWebサービスフレームワークには、さらにWoodstoxがバンドルされています。

受け入れられた答えは、コンテンツを解析してDOMドキュメント(解析から開始)する方法をすでに示しているため、それで十分かもしれません。唯一の注意点は、入力ドキュメントの未加工サイズの3〜5倍のメモリが必要であることです。この制限を回避するには、 Woodstox (標準のStax APIを実装)などのストリーミングパーサーを使用できます。その場合、XMLStreamReaderを作成し、reader.next()がtrueを返す限り、reader.hasNext()を呼び出すだけです。

5
StaxMan

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html これは役に立ちますか?かなり堅牢なXSDを使用します。ドキュメントの構造を検証できるだけでなく、ノードや属性に含めることができるコンテンツのタイプに関する非常に複雑なルールを指定できます。

1
nsfyn55