トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

ScrapCode/Java/XmlParse

INDEX

XML解析

XMLを解析(と検証)をする。

パーサーカークラス

XMLを解析(と検証)し、指定されたパスのノードを返す。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * $Id: XmlParse.java,v 0.0 2006/11/15 11:31:41 t-imamura Exp $
 *
 * Copyright (c) 2006 t-imamura, All rights reserved.
 */

import java.io.File;
import java.io.IOException;
import java.io.StringReader;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.sun.org.apache.xpath.internal.XPathAPI;

/**
 * XMLテスト
 */
public class XmlParse {

    // 中略

    /**
     * XMLを解析(と検証)し、指定されたパスのノードを返します。
     * @param xml XML のファイル名 <s>(もしくは、文字列)</s>
     * @param xsd XML Schema のファイル名 <s>(もしくは、文字列)</s>、or <code>null</code>
     * @param isValidat ドキュメント検証をするか。
     *                   スキーマを利用した場合は、スキーマによる検証になります。
     * @param xPath ルートとするノードのXPath
     * @return 指定したXMLの <code>xPath</code> の示すノード
     * @throws SAXException 構文解析時にエラーが発生した場合
     * @throws ParserConfigurationException 要求された構成を満たすDocumentBuilderを生成できない場合
     * @throws IOException 入出力エラーが発生した場合
     * @throws TransformerException 変換処理中(XPath)にエラーが発生した場合
     */
    public static Node xmlParsing(String xml, String xsd, boolean isValidat, String xPath)
            throws SAXException, ParserConfigurationException, IOException, TransformerException {
        ErrorHandler xmlErrorHandler = null;
        StringReader reader = null;
        Schema schema = null;
        Document document = null;
        Node result = null;

        // エラーハンドラを作成 (※使う場合はセット)
        xmlErrorHandler = new XmlErrorHandler();

        // スキーマの読み込み
        if( xsd != null ) try {
            /** ※入力が文字列の場合
            // 文字列からストリームを作成
            reader = new StringReader(xsd);
            // ストリームソースを作成
            StreamSource schemaSource = new StreamSource(reader);
            */
            /** ※入力がファイルの場合 */
            // パス名文字列からFileを作成
            File schemaSource = new File(xsd);
            // スキーマファクトリを生成
            SchemaFactory schemaFactory = 
                    SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
            // エラーハンドラをセット
            schemaFactory.setErrorHandler(xmlErrorHandler);
            // スキーマを生成
            schema = schemaFactory.newSchema(schemaSource);
            // スキーマを利用する場合は、ドキュメントの妥当性検証はしない
            isValidat = false;
        } catch (SAXException ex) {
            throw ex;
        } finally {
            if( reader != null ){
                reader.close();
                reader = null;
            }
        }

        // ドキュメントの読み込み
        try {
            /** ※入力が文字列の場合
            // 文字列からストリームを作成
            reader = new StringReader(xml);
            // 入力ソースを作成
            InputSource source = new InputSource(reader);
            */
            /** ※入力がファイルの場合 */
            // パス名文字列からFileを作成
            File source = new File(xml);
            // ドキュメントビルダーファクトリを生成
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 名前空間を有効にする
            factory.setNamespaceAware(true);
            // ドキュメント検証スキーマ
            factory.setSchema(schema);
            // ドキュメントの妥当性を検証する
            factory.setValidating( isValidat );
            // ドキュメントビルダーを生成
            DocumentBuilder builder = factory.newDocumentBuilder();
            // エラーハンドラをセット
            builder.setErrorHandler(xmlErrorHandler);
            // パースを実行してDocumentオブジェクトを取得
            document = builder.parse(source);
        } catch (ParserConfigurationException ex) {
            throw ex;
        } catch (SAXException ex) {
            throw ex;
        } catch (IOException ex) {
            throw ex;
        } finally {
            if( reader != null ){
                reader.close();
                reader = null;
            }
        }

        // ルートノードの取得
        result = document.getDocumentElement();
        if( xPath != null ) try {
            result = XPathAPI.selectSingleNode(document, xPath);
        } catch (TransformerException ex) {
            throw ex;
        }

        return result;
    }

}

エラーハンドラクラス

XML解析時にエラーが発生した場合に呼ばれる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*
 * $Id: XmlErrorHandler.java,v 0.0 2006/11/15 00:00:00 t-imamura Exp $
 *
 * Copyright (c) 2006 T.Imamura, All rights reserved.
 */

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * SAX エラーハンドラクラス
 * {@link javax.xml.parsers.DocumentBuilder#setErrorHandler(ErrorHandler)} で利用します。
 */
public class XmlErrorHandler implements ErrorHandler {

    /**
     * コンストラクタ
     */
    public XmlErrorHandler() {
        super();
    }

    /* 警告の通知
     * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
     */
    public void warning(SAXParseException exception) throws SAXException {
        System.err.println("Warning : " + getMsg(exception));
    }

    /* 回復可能なエラーの通知
     * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
     */
    public void error(SAXParseException exception) throws SAXException {
        System.err.println("Error : " + getMsg(exception));
    }

    /* 回復できないエラーの通知
     * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
     */
    public void fatalError(SAXParseException exception) throws SAXException {
        System.err.println("Fatal : " + getMsg(exception));
    }

    /**
     * XML構文解析例外からエラーメッセージを組み立てます。
     * システム識別子、行・列番号、詳細メッセージを出力します。
     * @param ex XML構文解析例外
     * @return エラーメッセージ
     */
    private String getMsg(SAXParseException ex) {
        StringBuffer str = new StringBuffer();
        str.append(ex.getSystemId()).append("(");
        str.append(ex.getLineNumber()).append(":");
        str.append(ex.getColumnNumber()).append(") : ");
        str.append(ex.getMessage());
        return str.toString();
    }

}

最終更新時間:2008年11月17日 20時23分00秒 指摘や意見などあればSandBoxのBBSへ。