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のストリームがよく分からないので、まだまだ試行錯誤だな。