Java XML プロセッシング: SAX と DOM を活用した検証と変換技術

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 で定義された構造を基に検証を行う場合、以下の手順を実施します:

  1. 検証対象のドキュメントに Schema を関連付ける
  2. パーサーに適切なプロパティを設定する
  3. エラーハンドラを設定する

プロパティの設定例:

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 に変換します。

タグ: SAX dom XML Schema XSLT Validation

7月14日 18:31 投稿