!!!XML解析 {{category ScrapCode,Java,nolink}}XMLを解析(と検証)をする。 !!!パーサーカークラス XMLを解析(と検証)し、指定されたパスのノードを返す。 {{code Java,4, /* * $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 のファイル名 (もしくは、文字列) * @param xsd XML Schema のファイル名 (もしくは、文字列)、or null * @param isValidat ドキュメント検証をするか。 * スキーマを利用した場合は、スキーマによる検証になります。 * @param xPath ルートとするノードのXPath * @return 指定したXMLの xPath の示すノード * @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解析時にエラーが発生した場合に呼ばれる。 {{code Java,4, /* * $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(); } } }}