Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-14.log failed
Geneate xml with dom
Dom level 3を用いたXML生成方法を紹介します。
記事を書く時点での最新のXerces2.9.1とJDK1.5を前提としています。
その為、exampleを実行する為にはxercesImpl.jarとserializer.jarが必要となります。
Example
例として、次の簡単なxmlを作成してみましょう。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE USERS SYSTEM "users.dtd"> <USERS> <USER ID="PWD122" TYPE="customer">Tim@Home</USER> <USER ID="MX787" TYPE="manager">Jack&Moud</USER> <USER ID="A4Q45" TYPE="employee">John D'oé</USER> </USERS>
source snippet
以下にソースの一部分を示します。
import org.apache.xerces.dom.DOMImplementationImpl; import org.w3c.dom.DOMConfiguration; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.bootstrap.DOMImplementationRegistry; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSOutput; import org.w3c.dom.ls.LSSerializer; ..............省略..................... public static void generateXmlWithDom(OutputStream out) throws Exception { DOMImplementation impl = DOMImplementationImpl.getDOMImplementation(); //set DOCTYPE ( dtd ) DocumentType doctype = impl.createDocumentType("users", null, "users.dtd"); Document xmldoc = impl.createDocument(null, null, doctype); // Root element. Element root = xmldoc.createElement("USERS"); String[] id = {"PWD122","MX787","A4Q45"}; String[] type = {"customer","manager","employee"}; String[] desc = {"Tim@Home","Jack&Moud","John D'o"}; for (int i=0;i<id.length;i++) { // Child i. e = xmldoc.createElementNS(null, "USER"); e.setAttributeNS(null, "ID", id[i]); e.setAttributeNS(null, "TYPE", type[i]); n = xmldoc.createTextNode(desc[i]); e.appendChild(n); root.appendChild(e); } xmldoc.appendChild(root); // Xml serialization DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); DOMImplementationLS ls = (DOMImplementationLS) registry.getDOMImplementation("LS"); LSSerializer writer = ls.createLSSerializer(); LSOutput output = ls.createLSOutput(); output.setByteStream(out); output.setEncoding("UTF-8"); // set indent DOMConfiguration config = writer.getDomConfig(); config.setParameter("format-pretty-print", new Boolean(true)); writer.write(xmldoc, output); out.close(); }
Xerces2.9.0からXMLserializerがdeprecatedになっている為、LSSerializer(XML)またはJAXP Transformer API(HTML, XHTML,SAX)を使うのが進められています。
元々、Xercesプロジェクトで含まれていたserializationコードをXalanプロジェクトで取って、開発を進めたせいで、同期が取れなくなったらしいです。
Xalanのserializationコードがパフォーマンスが良く、バグの修正など長所があるため、徐々にXalanコードに移行することに決まったわけです。
このことが2004年の出来事なので、以降はXalanのserializationコードが利用される見込みです。