http://xmlgraphics.apache.org/http://www.apache.org/http://www.w3.org/

Home

Overview
FAQ
Wiki
License
Download
Install
Demo

In the news

Tools and Apps
Browser
Rasterizer
Font Converter
Pretty-printer

Architecture
API (Javadoc)
Generator
DOM API
JSVGCanvas
Transcoder API

Scripting Intro
Scripting Features
Java Scripting
Security

Extensions

Testing

Contributors
Mail Lists

SVN Repository
Bug Database

Status

Glossary


Introduction

The Document Object Model (DOM) is an API for XML documents. It defines the logical structure of documents and the way a document is accessed and manipulated. This paper shows how to create an SVG document using the DOM API.


Getting started

The DOM API defines an interface called DOMImplementation which represents the boostrap of any DOM implementation. The role of this class is to bootstrap a particular implementation of the DOM by providing a method to create a Document. Then, the concrete Document represents an XML document and also acts like a factory for the various DOM objects such Element, Attr or XML content.

How to get an instance of the DOMImplementation interface depends on the DOM implementation you are using. In Batik, the DOM implementation is located in the package org.apache.batik.dom.svg and the class is named SVGDOMImplementation. The following example shows how to get a concrete DOMImplementation object.

import org.w3c.dom.DOMImplementation;
import org.apache.batik.dom.svg.SVGDOMImplementation;

DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();

Once you have an instance of a DOMImplementation, you are not relying on proprietary code anymore and ready to use the DOM API.


Creating a Document

Using the DOMImplementation, you are now able to create a Document. The following example illustrates how to create an SVG document. Note that the Batik's Document Object Model implementation can be used to represent either an SVG document fragment or any kind of XML document. The following code shows how to get a concrete Document object using a DOMImplementation. Note that by choosing the namespace URI and the local name of the root element of SVG, we are creating an SVG document.

import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.Document;

DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
// we are using a constant available on the SVGDOMImplementation
// but we could have used "http://www.w3.org/2000/svg"
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
Document doc = impl.createDocument(svgNS, "svg", null);

As we have created an SVG Document, we can cast this document to an SVGDocument (defined in the org.w3c.dom.svg package) if needed.


Building an SVG Document

Finally, using the Document object, we are now able to construct SVG content. Note that the document created before supports both generic XML and SVG. Though the DOM implementation of Batik is an SVG DOM implementation, the SVG part is not fully implemented yet so only the DOM Level 2 core functions should be used. The following example shows how to create a red rectangle located at (10, 20), with a size of (100, 50) placed in a (400, 450) SVG canvas.

import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
Document doc = impl.createDocument(svgNS, "svg", null);

// get the root element (the svg element)
Element svgRoot = doc.getDocumentElement();

// set the width and height attribute on the root svg element
svgRoot.setAttributeNS(null, "width", "400");
svgRoot.setAttributeNS(null, "height", "450");

// create the rectangle
Element rectangle = doc.createElementNS(svgNS, "rect");
rectangle.setAttributeNS(null, "x", "10");
rectangle.setAttributeNS(null, "y", "20");
rectangle.setAttributeNS(null, "width", "100");
rectangle.setAttributeNS(null, "height", "50");
rectangle.setAttributeNS(null, "style", "fill:red");

// attach the rectangle to the svg root element
svgRoot.appendChild(rectangle);

The example given has the following equivalent SVG.

<svg width="400" height="450">
    <rect x="10" y="20" width="100" height="50" style="fill:red"/>
</svg>

Creating a Document from an SVG file

With Batik, you can also create an SVG DOM tree from a URI, an InputStream, or a Reader - using the SAXSVGDocumentFactory. The following example illustrates how to create an SVG document. Note that the Batik's Document Object Model implementation can be used to represent either an SVG document fragment or any kind of XML document. The following code shows how to get a concrete Document object using the SAXSVGDocumentFactory.

import java.io.IOException;

import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.util.XMLResourceDescriptor;

import org.w3c.dom.Document;

try {
    String parser = XMLResourceDescriptor.getXMLParserClassName();
    SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
    String uri = "http://...";
    Document doc = f.createDocument(uri);
} catch (IOException ex) {
     // ...
}

As we have created an SVG Document, we can cast this document to an SVGDocument (defined in the org.w3c.dom.svg package) if needed.


Rendering an SVG DOM

Batik provides several ways to use an SVG DOM tree. Two modules can be immediately used to render your SVG document.

  • JSVGCanvas -
  • The JSVGCanvas is a swing component that can display SVG document. A SVG document can be specified using a URI or an SVG DOM tree (using the setSVGDocument method). For futher informations about the JSVGCanvas, see the JSVGCanvas tutorial.
  • ImageTranscoder -
  • The ImageTranscoder is a transcoder which can take a URI, an InputStream or an SVG DOM tree and produces a raster image (such JPEG, PNG or Tiff). By creating a TranscoderInput with the SVG DOM tree, you will be able to transform your SVG content to a raster image. For futher informations, see the Transcoder tutorial.


    Copyright © 2000-2005 The Apache Software Foundation. All Rights Reserved.