top / index / prev / next / target / source

2005-08-03 diary: [Java] XMLファイルを効率的に作成する方法 (SAX2ベース)

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

[Java] XMLファイルを効率的に作成する方法 (SAX2ベース)

Xerces-Jの際に利用していたContentHandlerベースによるXML作成方法の Java API版のメモです。 , バリウムにてよれよれです。

XMLファイルを効率的に作成する方法 (SAX2ベース)

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作成方法は非常に大事なものです。少なくとも私にとっては重要な発見でした。

関連するリソース

関連する日記

健康診断バリウム効果

健康診断でバリウムを頂きました。バリウムの後にいただく とある錠剤の効果が抜群でして、今日は もうダメっぽいです。

関連する日記

登場キーワード


この日記について