- PR -

サーブレットからXMLファイルを生成する方法

投稿者投稿内容
naoki
会議室デビュー日: 2005/01/20
投稿数: 6
投稿日時: 2005-01-20 17:13
初めて投稿させていただきます。
サーブレットからXMLファイルを生成するメソッドを呼ぶと
java.lang.ClassCastExceptionが発生してしまいます。

OS:Windows2000
Server:Tomcat5
SDK:J2SDK1.4

import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Element;
import org.w3c.dom.Attr;

import org.apache.crimson.tree.XmlDocument;

public class XmlCreate{
public void xmlCreate(String xmlCreateFile) throws IOException,ParserConfigurationException{
// DOMの準備をする
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=null;
try{
db=dbf.newDocumentBuilder();
}catch(ParserConfigurationException ex){
throw ex;
}

// 文書を新規作成する
Document doc=db.newDocument();

// 処理命令を作成します。
Node node;
ProcessingInstruction pi;
String procStr = "type=\\"application/xml\\" href=\\"j01_03_01.xsl\\"";
pi = doc.createProcessingInstruction("xml-stylesheet", procStr );
// 文書に追加します。
node = doc.appendChild(pi);

// ルート要素追加
Element rootElm=doc.createElement("root");
doc.appendChild(rootElm);
// タイトル要素追加
Element taitle=doc.createElement("title");
taitle.appendChild(doc.createTextNode("タイトル"));
rootElm.appendChild(taitle);

// 文書を書き出す
XmlDocument xdoc=(XmlDocument)doc;
BufferedWriter bw=new BufferedWriter(new FileWriter(createXmlFile));
xdoc.write(bw, "xxx" );
bw.close();
}
}

ちなみに、上記メソッドをjavaアプリから呼出すと、例外も発生せずに、XMLファイルが
出力されます。呼出元が変わっても問題なく処理されると思っていたので、
なぜ例外が発生するのかわかりません。
なにか少しでもわかる事がございましたら、ご教示ください。
お願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-01-21 02:40
サーブレットコンテナで crimson 以外の XML パーサが使われているからではないでしょうか?
どうしても特定の XML パーサの型で使いたいのであれば実行環境でその XML パーサが使われるよう設定しなければ成りません。
naoki
会議室デビュー日: 2005/01/20
投稿数: 6
投稿日時: 2005-01-21 10:24
インギさん、早速の返答ありがとうございます。

サーブレットコンテナがどのXMLパーサを使用しているのかを調べる方法が
わからないので教えていただけないでしょうか。
サーブレットからXMLファイルが生成できればXMLパーサの種類はどれでもかまいません。
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2005-01-21 12:19
キャストに失敗しているところで対象オブジェクトのgetClass().getName()を見れば実装クラス名がわかると思います。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-01-21 12:32
XMLパーサに依存しないようにコーディングすればよいのではないですか?
以前にも同じような質問に答えたような気がするので探してみました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13263&forum=12
naoki
会議室デビュー日: 2005/01/20
投稿数: 6
投稿日時: 2005-01-21 18:06
ありがとうございました。

XMLファイルは作成することが出来るようになったのですが、
その作成したXMLファイルとXSLファイルを使用して新たなファイル(.pxd)を
作成しようとしているのですが例外が出力されて、作成できませんでした。
javax.xml.transform.TransformerConfigurationException: javax.xml.transform.TransformerConfigurationException: javax.xml.transform.TransformerException: java.net.MalformedURLException: unknown protocol: f
at org.apache.xalan.processor.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:767)
at jp.co.tecs_g.common.utility.ReportCreate.reportCreate(ReportCreate.java:54)
at jp.co.tecs_g.passwdchange.controll.PasswdChangeCtrl_Change.btnProc(PasswdChangeCtrl_Change.java:92)
at jp.co.tecs_g.passwdchange.controll.PasswdChangeCtrl.doPost(PasswdChangeCtrl.java:101)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at jp.co.tecs_g.common.filter.SetCharEncodFilter.doFilter(SetCharEncodFilter.java:84)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:536)
Caused by: javax.xml.transform.TransformerConfigurationException: javax.xml.transform.TransformerException: java.net.MalformedURLException: unknown protocol: f
at org.apache.xalan.processor.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:964)
at org.apache.xalan.processor.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:750)
... 32 more
Caused by: javax.xml.transform.TransformerException: java.net.MalformedURLException: unknown protocol: f
at org.apache.xalan.processor.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:958)
... 33 more
Caused by: java.net.MalformedURLException: unknown protocol: f
at java.net.URL.<init>(URL.java:586)
at java.net.URL.<init>(URL.java:476)
at java.net.URL.<init>(URL.java:425)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xalan.processor.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:934)
... 33 more

***** 変換するソースファイル *****
public static void reportCreate(
String procFile
)throws TransformerConfigurationException,
TransformerException,
FileNotFoundException{
try{
TransformerFactory factory = TransformerFactory.newInstance();
// XSLファイルからtranceformerを取得

StreamSource ss = new StreamSource("XXX.xsl");
Transformer transformer = factory.newTransformer(ss);

// 出力するエンコーディングを設定
transformer.setOutputProperty("encoding" , "Shift-JIS");
// XMLファイルをXSLTで変換して出力
StreamResult result = new StreamResult(new FileOutputStream(new File("XXX.pdx")));
transformer.transform(new StreamSource( "XXX.xml" ), result);



ちなみに、上記メソッドをjavaアプリから呼出すと、例外も発生せずに、pxdファイルが
作成されます。
なにか少しでもわかる事がございましたら、ご教示ください。
お願いいたします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-01-21 18:14
Javaアプリではxxx.xslがカレントディレクトリにあるから読み込めるけど、Tomcatでは
そうではない、ということではないでしょうか。まずは絶対パスでファイルを指定してみて、
動作するかどうか確認してみてはどうですか?
naoki
会議室デビュー日: 2005/01/20
投稿数: 6
投稿日時: 2005-01-21 22:07
ソースを正確に記述していなくてすみません。
1:StreamSource ss = new StreamSource("XXX.xsl");
2:Transformer transformer = factory.newTransformer(ss); ←ここで例外発生

xxx.xslファイルは絶対パスで指定しています。
xxx.xslファイルを仮にファイル名のみ指定をした場合、
FileNotFoundException例外が発生しました。
なので、xxx.xslファイルはちゃんと処理できていると思います。
2の個所でなぜ例外が発生するのかがまだわかっていないです。
javaアプリとサーブレットで、なにか違いがあるのでしょうか?

スキルアップ/キャリアアップ(JOB@IT)