XML ドキュメントの検証処理
XML ドキュメントの検証は、構文の正確性だけでなく、構造の妥当性を確認するための重要なプロセスです。このセクションでは、SAX パーサーを活用した検証メカニズムについて説明します。
パーサー実装の選択
デフォルトの SAX パーサー以外の実装を使用する場合、環境変数を設定する必要があります。以下のコマンドで実行可能です:
java -Djavax.xml.parsers.SAXParserFactory=your.package.YourParser [...]
指定するクラス名は完全修飾名でなければなりません。詳細は SAXParserFactory クラスの newInstance() メソッドを参照してください。
検証パーサーの設定
検証を有効にするためには、パーサー工場を適切に設定する必要があります。以下の例は、検証を有効にするための設定方法を示しています。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
DocumentBuilder builder = factory.newDocumentBuilder();
この設定により、DTD または XML Schema に基づいた検証が可能になります。
XML Schema を使用した検証
XML Schema で定義された構造を基に検証を行う場合、以下の手順を実施します:
- 検証対象のドキュメントに Schema を関連付ける
- パーサーに適切なプロパティを設定する
- エラーハンドラを設定する
プロパティの設定例:
static final String SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
// 検証設定
if (useSchema) {
try {
factory.setAttribute(SCHEMA_LANGUAGE, XML_SCHEMA);
} catch (IllegalArgumentException e) {
System.err.println("不正なプロパティ: " + SCHEMA_LANGUAGE);
System.exit(1);
}
}
エラーハンドリングの重要性
検証エラーを適切に処理するためには、エラーハンドラを設定する必要があります。以下はエラーハンドラの基本的な実装例です:
private static class ValidationErrorHandler implements ErrorHandler {
public void error(SAXParseException e) throws SAXException {
throw new SAXException("検証エラー: " + e.getMessage());
}
// warning と fatalError の実装も同様
}
このハンドラを設定しないと、検証エラーが無視され、アプリケーションは正常に実行されます。
DOM でのデータ処理
DOM (Document Object Model) は XML ドキュメントをツリー構造で表現するための標準です。DOM を使用したデータ処理の基本を説明します。
DOM への XML データの読み込み
XML ファイルを DOM に変換する基本的なコード例:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false); // 検証を無効
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("sample.xml"));
DOM ツリーの探索
特定の要素を検索するためのユーティリティメソッド:
private Node findElementByName(Node parent, String tagName) {
if (parent == null || !parent.hasChildNodes()) {
return null;
}
NodeList children = parent.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE &&
tagName.equals(child.getNodeName())) {
return child;
}
}
return null;
}
テキストコンテンツの取得
要素内のテキストを取得するためのメソッド:
private String getNodeText(Node node) {
StringBuilder text = new StringBuilder();
if (node == null || !node.hasChildNodes()) {
return "";
}
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.TEXT_NODE) {
text.append(child.getNodeValue());
} else if (child.getNodeType() == Node.CDATA_SECTION_NODE) {
text.append(child.getNodeValue());
}
}
return text.toString().trim();
}
XSLT 変換の基本
XSLT を使用した XML データの変換プロセスを説明します。
XSLT パーサーの設定
変換を実行するための基本的な設定:
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(
new StreamSource(new File("stylesheet.xsl"))
);
変換の実行
XML データを変換するためのコード例:
Source xmlSource = new StreamSource(new File("input.xml"));
Result output = new StreamResult(new File("output.html"));
transformer.transform(xmlSource, output);
このコードは、指定された XSL スタイルシートを使用して XML ファイルを HTML に変換します。