INDEX
XML解析
XMLを解析(と検証)をする。
パーサーカークラス
XMLを解析(と検証)し、指定されたパスのノードを返す。
1 |
/*
* $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 |
/*
* $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へ。