4

Java では、javax.xml.validation.Validator を使用して XSD スキーマに対して、または org.xml.sax.XMLReader を使用して単純に文書を解析することにより、DTD に対して XML 文書を検証できます。

私が必要としているのは、ドキュメント自体が DTD (<!DOCTYPE ...>ステートメントを含む) に対して検証するか、XSD に対して検証するかをプログラムで判断する方法です。理想的には、XML ドキュメント全体をメモリにロードせずにこれを行う必要があります。誰でも助けてもらえますか?

(あるいは、XSD と DTD の両方で動作し、リソースのカスタム解決を可能にする、Java で XML ドキュメントを検証する単一の方法があれば、さらに優れています!)

どうもありがとう、

4

4 に答える 4

1

任意のXMLドキュメントを検証する方法を決定するための100%確実なプロセスはありません。

たとえば、このバージョン2.4のWebアプリケーションデプロイメント記述子は、ドキュメントを検証するためのW3スキーマを指定します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

ただし、これは同じことを表現するための同様に有効な方法です。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee">

RELAX NGには、ドキュメント内で使用すべきヒントを提供するメカニズムがないようです。検証メカニズムは、プロデューサーではなく、ドキュメントのコンシューマーによって決定されます。私が誤解していなければ、これはDTDからより最新の検証メカニズムへの切り替えを推進する推進力の1つでした。

私の意見では、最善の策は、処理しているドキュメントタイプのセットに合わせてメカニズム検出器を調整し、ヘッダー情報を読み取り、適切に解釈することです。StAXパーサーはこれに適しています-プルメカニズムであるため、ファイルの先頭を読み取ってから、最初の要素の解析を終了することができます。

同じサンプルコードなどへのリンク。

于 2009-02-21T14:08:03.567 に答える
0

文字列比較を使用できますか?

public enum Type {
    XSD,
    DTD,
    UNKNOWN
};

public Type findType(File f) throws FileNotFoundException, IOException {
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new FileReader(f));
        String line;
        // may want to cut this loop off after a certain number of lines
        while ((line = reader.readLine()) != null) {
            line = line.toLowerCase();
            if (line.contains("<!doctype"))
                return Type.DTD;
            else if (line.contains("xsi:schemaLocation"))
                return Type.XSD;
        }
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException ex) {}
        }
    }
    return Type.UNKNOWN;
}
于 2009-01-30T22:44:19.203 に答える
0

特定の dtd に対して xml を検証する方法のコード例を投稿できますか。スキーマでは簡単に思えますが、dtd でそれを行う方法を見つけるのに苦労しています。

どうもありがとう、

デニス。

私はそれを見つけました:

    XMLReader reader = XMLReaderFactory.createXMLReader();

    // try to activate validation
    try {
          // Turn on validation
          reader.setFeature("http://xml.org/sax/features/validation", true);
          // Ensure namespace processing is on (the default)
          reader.setFeature("http://xml.org/sax/features/namespaces", true);
    } catch (SAXException e) {
        System.err.println("Cannot activate validation.");
    }

    try {
        reader.parse("testFiasRequest.xml");
    } catch (IOException e) {
        System.err.println("I/O exception reading XML document");
    } catch (SAXException e) {
        System.err.println("XML exception reading document.");
    }
于 2009-02-10T14:56:43.773 に答える