top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
Xerces-Jの際に利用していたContentHandlerベースによるXML作成方法の Java API版のメモです。 , バリウムにてよれよれです。
XMLファイルをSAX2ベースで効率的に作成する方法をメモしておきます。ここしばらく この方法が分からずに、ずーっと気になっていたのです。ようやく今日 わかりました。 SimpleSaxWriter.java
/*
* 非常にシンプルで効率的な SAX2ライター・ハンドラ
* Copyright (C) 2005 いがぴょん
*/
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
/**
* 非常にシンプルなSAX2ハンドラ・ライター <br>
* メモリ効率良くXMLファイルをSAXベースで作成する際に必要になる方法です。
*
* @author Tosiki Iga 2005.08.03
*/
public class SimpleSaxWriter {
public static void main(String[] args) throws SAXException,
TransformerConfigurationException, IllegalArgumentException,
FileNotFoundException {
TransformerFactory tf = TransformerFactory.newInstance();
SAXTransformerFactory saxTf = (SAXTransformerFactory) tf;
TransformerHandler saxHandler = saxTf.newTransformerHandler();
saxHandler.setResult(new StreamResult(new FileOutputStream("わーく.xml")));
saxHandler.startDocument();
AttributesImpl attributes = new AttributesImpl();
attributes.addAttribute("http://www.w3.org/2000/xmlns/", "soapenv",
"xmlns:soapenv", "CDATA",
"http://schemas.xmlsoap.org/soap/envelope/");
attributes.addAttribute("http://www.w3.org/2000/xmlns/", "xsd",
"xmlns:xsd", "CDATA", "http://www.w3.org/2001/XMLSchema");
attributes.addAttribute("http://www.w3.org/2000/xmlns/", "xsi", "xmlns:xsi", "CDATA",
"http://www.w3.org/2001/XMLSchema-instance");
saxHandler.startElement("http://schemas.xmlsoap.org/soap/envelope/",
"Envelope", "soapenv:Envelope", attributes);
saxHandler.startElement("http://schemas.xmlsoap.org/soap/envelope/",
"Body", "soapenv:Body", new AttributesImpl());
attributes = new AttributesImpl();
attributes.addAttribute("http://www.w3.org/2000/xmlns/", "xmlns",
"xmlns", "CDATA", "http://DefaultNamespace");
saxHandler.startElement("http://DefaultNamespace", "method01", "method01", attributes);
attributes = new AttributesImpl();
attributes.addAttribute("http://www.w3.org/2000/xmlns/", "xmlns",
"xmlns", "CDATA", "");
saxHandler.startElement("", "arg1", "arg1", attributes);
char[] charMsg = "こんにちは".toCharArray();
saxHandler.characters(charMsg, 0, charMsg.length);
saxHandler.endElement("", "arg1", "arg1");
attributes = new AttributesImpl();
attributes.addAttribute("http://www.w3.org/2000/xmlns/", "xmlns", "xmlns", "CDATA", "");
saxHandler.startElement("", "arg2", "arg2", attributes);
charMsg = "123".toCharArray();
saxHandler.characters(charMsg, 0, charMsg.length);
saxHandler.endElement("", "arg2", "arg2");
saxHandler.endElement("http://DefaultNamespace", "method01", "method01");
saxHandler.endElement("http://schemas.xmlsoap.org/soap/envelope/",
"Body", "soapenv:Body");
saxHandler.endElement("http://schemas.xmlsoap.org/soap/envelope/",
"Envelope", "soapenv:Envelope");
saxHandler.endDocument();
}
}
※2005.08.11追記 .translate()を利用しないので、最後にライターを明示的にクローズする必要があります。この問題は上記コードに未反映です。 このSAX2ハンドラによるXML作成方法は非常に大事なものです。少なくとも私にとっては重要な発見でした。
関連するリソース
関連する日記
健康診断でバリウムを頂きました。バリウムの後にいただく とある錠剤の効果が抜群でして、今日は もうダメっぽいです。
関連する日記