XML ドキュメントが DTD または XSD に対して検証されるかどうかを確認するにはどうすればよいですか?
-
20-08-2019 - |
質問
Java では、javax.xml.validation.Validator を使用して XML ドキュメントを XSD スキーマに対して検証したり、org.xml.sax.XMLReader を使用してドキュメントを解析するだけで DTD に対して XML ドキュメントを検証したりできます。
ただし、私に必要なのは、ドキュメント自体が DTD に対して検証されるかどうかをプログラムで判断する方法です (つまり、が含まれています <!DOCTYPE ...>
ステートメント) または XSD。理想的には、XML ドキュメント全体をメモリにロードせずにこれを行う必要があります。誰か助けてくれませんか?
(あるいは、 シングル XSD と DTD の両方で機能し、リソースのカスタム解決を可能にする、Java で XML ドキュメントを検証する方法があれば、さらに良いでしょう)
どうもありがとう、
あ
解決
任意の 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">
リラックスNG を提供するメカニズムはないようです どれでも それを使用する必要があるというヒントが文書内にあります。検証メカニズムは、作成者ではなくドキュメントの利用者によって決定されます。私の記憶が間違っていなければ、これが DTD からより最新の検証メカニズムへの切り替えを推進する原動力の 1 つでした。
私の意見では、処理している一連の文書タイプに合わせてメカニズム検出器を調整し、ヘッダー情報を読み取り、それを適切に解釈するのが最善の策だと思います。の StAX パーサー これはプル メカニズムであるため、ファイルの先頭を読み取るだけで、最初の要素の解析を終了できます。
他のヒント
のためのパッケージの説明を参照してください。持つjavax.xml.validationする。これは、両方のXSDとDTD
を検証するための情報と例が含まれていますあなただけの文字列比較を使用してもらえますか?
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;
}
あなたは多分あなたが与えられたDTDに対してXMLを検証する方法のコード例を投稿できます。それは、スキーマのために簡単であると思われるが、私は、DTDでそれを行う方法を見つけるのに苦労しています。
どうもありがとう、
デニスます。
[OK]を私はそれを見つけます:
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.");
}