XMLのValidateおかわり
先日、XMLのValidateをやったのだけれど、
どうもあの方法は上手くない。
つーか、サーバ上での操作であれば、あれでいいのだけれど、
Validateをたとえば、アプレットのようなクライアントツールで動かす場合、
一時ファイルをクライアント側に作らせるわけにはいくまい。
・・・ということで、以下のように直してみた。
つーか、こっちが普通なんだろうけれどね。
やりたいことは、
任意のXMLドキュメントに対して、任意のDTD(またはXMLSchema)のValidateチェックを行うというもの。
とりあえず、XMLドキュメントをtrancefoamerオブジェクトで変換。
このときに、dtdの場合はDOCTYPEを指定する。
//ドキュメントを変換して出力
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, XML_ENCODING);
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "dtdのURL");
その後、変換したオブジェクトを一旦ストリームに吐き出す。
ストリームは、バイトストリームを使用。
out = new ByteArrayOutputStream();
StreamResult result = new StreamResult(out);
transformer.transform(source, result);
byte[] bt = out.toByteArray();
//生成先となるXMLドキュメントを作成
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
dbf.setNamespaceAware(true);
DocumentBuilder db = null;
出力したバイトストリームの変換結果が、resultに保持されているので、
その結果を、入力ストリームに変換し、XMLドキュメントを生成。
Document doc = null;
in = new ByteArrayInputStream(bt);
try {
doc = db.parse(in);
} catch (IOException ex) {} catch (SAXException ex ) {
errMessage = ex.getMessage();
}catch(Exception e){
throw e;
}
かなりはしょったけれど、とりあえず順序的にはそういう感じ。
Javaのストリームがよく分からないので、まだまだ試行錯誤だな。