I want to build a SVG DOM from a SAX event stream, but I realized that it
wasn't possible using org.apache.batik.dom.svg.SAXSVGDocumentFactory. So I
modified that class and org.apache.batik.dom.util.SAXDocumentFactory a bit
to make it possible (see the attached patches). It seems to work, and I can
put the generated DOM into the transcoder. However, if the SVG contains an
external xlink, I get this strange error message from the Crimson parser
during transcoding (which is made visible by my patch to
org.apache.batik.dom.util.SAXDocumentFactory):
org.xml.sax.SAXParseException: org.apache.crimson.parser/P-001 3c
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3030)
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3024)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:505)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:304)
at
org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:433)
at
org.apache.batik.dom.util.SAXDocumentFactory.createDocument(SAXDocumentFactory.java:229)
What does it mean?
The patch:
Index: org/apache/batik/dom/util/SAXDocumentFactory.java
===================================================================
RCS file:
/home/cvspublic/xml-batik/sources/org/apache/batik/dom/util/SAXDocumentFactory.java,v
retrieving revision 1.3
diff -c -r1.3 SAXDocumentFactory.java
*** org/apache/batik/dom/util/SAXDocumentFactory.java 2001/02/13 19:45:17 1.3
--- org/apache/batik/dom/util/SAXDocumentFactory.java 2001/09/08 14:58:20
***************
*** 126,131 ****
--- 126,152 ----
}
/**
+ * Creates a new SAXDocumentFactory object.
+ * No document descriptor will be created while generating a document.
+ * @param impl The DOM implementation to use for building the DOM tree.
+ */
+ public SAXDocumentFactory(DOMImplementation impl) {
+ this(impl, false);
+ }
+
+ /**
+ * Creates a new SAXDocumentFactory object.
+ * @param impl The DOM implementation to use for building the DOM tree.
+ * @param dd Whether a document descriptor must be generated.
+ */
+ public SAXDocumentFactory(DOMImplementation impl,
+ boolean dd) {
+ implementation = impl;
+ parserClassName = null;
+ createDocumentDescriptor = dd;
+ }
+
+ /**
* Creates a Document instance.
* @param ns The namespace URI of the root element of the document.
* @param root The name of the root element of the document.
***************
*** 168,173 ****
--- 189,204 ----
}
/**
+ * Prepares a GenericDocument. Use this method before firing SAX events.
+ * @param ns The namespace URI of the root element.
+ * @param root The name of the root element.
+ */
+ public void prepareDocument(String ns, String root)
+ {
+ document = implementation.createDocument(ns, root, null);
+ }
+
+ /**
* Creates a GenericDocument.
* @param ns The namespace URI of the root element.
* @param root The name of the root element.
***************
*** 178,186 ****
protected Document createDocument(String ns, String root, String uri,
InputSource is)
throws IOException {
! document = implementation.createDocument(ns, root, null);
! try {
XMLReader parser =
XMLReaderFactory.createXMLReader(parserClassName);
parser.setContentHandler(this);
--- 209,217 ----
protected Document createDocument(String ns, String root, String uri,
InputSource is)
throws IOException {
! prepareDocument(ns, root);
! try {
XMLReader parser =
XMLReaderFactory.createXMLReader(parserClassName);
parser.setContentHandler(this);
***************
*** 197,202 ****
--- 228,234 ----
parser.parse(is);
} catch (SAXException e) {
+ e.printStackTrace();
Exception ex = e.getException();
if (ex != null && ex instanceof InterruptedIOException) {
throw (InterruptedIOException)ex;
***************
*** 205,210 ****
--- 237,251 ----
}
return document;
+ }
+
+ /**
+ * Returns the created document. Use this method after firing SAX events.
+ *
+ * @return null if no document was previously generated.
+ */
+ public Document getDocument() {
+ return document;
}
/**
Index: org/apache/batik/dom/svg/SAXSVGDocumentFactory.java
===================================================================
RCS file:
/home/cvspublic/xml-batik/sources/org/apache/batik/dom/svg/SAXSVGDocumentFactory.java,v
retrieving revision 1.9
diff -c -r1.9 SAXSVGDocumentFactory.java
*** org/apache/batik/dom/svg/SAXSVGDocumentFactory.java 2001/07/18 22:04:53 1.9
--- org/apache/batik/dom/svg/SAXSVGDocumentFactory.java 2001/09/08 14:58:20
***************
*** 60,65 ****
--- 60,80 ----
/**
* Creates a new SVGDocumentFactory object.
+ */
+ public SAXSVGDocumentFactory() {
+ super(SVGDOMImplementation.getDOMImplementation());
+ }
+
+ /**
+ * Creates a new SVGDocumentFactory object.
+ * @param dd Whether a document descriptor must be generated.
+ */
+ public SAXSVGDocumentFactory(boolean dd) {
+ super(SVGDOMImplementation.getDOMImplementation(), dd);
+ }
+
+ /**
+ * Creates a new SVGDocumentFactory object.
* @param parser The SAX2 parser classname.
*/
public SAXSVGDocumentFactory(String parser) {
***************
*** 76,81 ****
--- 91,104 ----
}
/**
+ * Prepares a SVGOMDocument. Use this method before firing SAX events.
+ */
+ public void prepareDocument()
+ {
+ super.prepareDocument(SVGDOMImplementation.SVG_NAMESPACE_URI, "svg");
+ }
+
+ /**
* Creates a SVGOMDocument instance.<br>
* This method supports gzipped sources.
* @param uri The document URI.
***************
*** 231,236 ****
--- 254,288 ----
throw new RuntimeException("Bad root element");
}
return createDocument(uri, r);
+ }
+
+ /**
+ * Returns the created document. Use this method after firing SAX events.
+ * @param uri The document URI (used to resolve links).
+ *
+ * @return <code>null</code> if no document was previously generated.
+ */
+ public SVGOMDocument getDocument(String uri)
+ throws IOException {
+ try {
+ return getDocument(new URL(uri));
+ } catch (MalformedURLException e) {
+ throw new IOException(e.getMessage());
+ }
+ }
+
+ /**
+ * Returns the created document. Use this method after firing SAX events.
+ * @param uri The document URI (used to resolve links).
+ *
+ * @return <code>null</code> if no document was previously generated.
+ */
+ public SVGOMDocument getDocument(URL uri)
+ throws IOException {
+ SVGOMDocument doc = (SVGOMDocument)super.getDocument();
+ if (doc == null) return null;
+ doc.setURLObject(uri);
+ return doc;
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]