141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// XMLWriter.java - serialize an XML document. 241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Written by David Megginson, david@megginson.com 341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// and placed by him into the public domain. 441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Extensively modified by John Cowan for TagSoup. 541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is licensed under the Apache License, 641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// Version 2.0. You may obtain a copy of this license at 741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// http://www.apache.org/licenses/LICENSE-2.0 . You may also have 841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// additional legal rights not granted by this license. 941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// 1041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// TagSoup is distributed in the hope that it will be useful, but 1141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// unless required by applicable law or agreed to in writing, TagSoup 1241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 1341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// OF ANY KIND, either express or implied; not even the implied warranty 1441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 1541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 1641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpackage org.ccil.cowan.tagsoup; 1741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 1841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.io.IOException; 1941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.io.OutputStreamWriter; 2041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.io.Writer; 2141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.util.Enumeration; 2241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.util.Hashtable; 2341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport java.util.Properties; 2441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 2541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.Attributes; 2641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.SAXException; 2741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.XMLReader; 2841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.helpers.AttributesImpl; 2941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.helpers.NamespaceSupport; 3041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.helpers.XMLFilterImpl; 3141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectimport org.xml.sax.ext.LexicalHandler; 3241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 3341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 3441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project/** 3541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Filter to write an XML document from a SAX event stream. 3641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 3741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This class can be used by itself or as part of a SAX event 3841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * stream: it takes as input a series of SAX2 ContentHandler 3941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * events and uses the information in those events to write 4041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * an XML document. Since this class is a filter, it can also 4141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * pass the events on down a filter chain for further processing 4241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * (you can use the XMLWriter to take a snapshot of the current 4341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * state at any point in a filter chain), and it can be 4441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * used directly as a ContentHandler for a SAX2 XMLReader.</p> 4541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 4641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The client creates a document by invoking the methods for 4741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * standard SAX2 events, always beginning with the 4841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #startDocument startDocument} method and ending with 4941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the {@link #endDocument endDocument} method. There are convenience 5041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * methods provided so that clients to not have to create empty 5141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * attribute lists or provide empty strings as parameters; for 5241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * example, the method invocation</p> 5341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 5441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 5541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startElement("foo"); 5641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 5741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 5841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>is equivalent to the regular SAX2 ContentHandler method</p> 5941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 6041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 6141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startElement("", "foo", "", new AttributesImpl()); 6241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 6341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 6441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Except that it is more efficient because it does not allocate 6541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * a new empty attribute list each time. The following code will send 6641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * a simple XML document to standard output:</p> 6741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 6841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 6941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * XMLWriter w = new XMLWriter(); 7041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 7141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument(); 7241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startElement("greeting"); 7341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.characters("Hello, world!"); 7441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endElement("greeting"); 7541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument(); 7641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 7741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 7841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The resulting document will look like this:</p> 7941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 8041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 8141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <?xml version="1.0" standalone="yes"?> 8241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 8341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <greeting>Hello, world!</greeting> 8441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 8541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 8641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>In fact, there is an even simpler convenience method, 8741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <var>dataElement</var>, designed for writing elements that 8841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * contain only character data, so the code to generate the 8941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * document could be shortened to</p> 9041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 9141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 9241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * XMLWriter w = new XMLWriter(); 9341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 9441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument(); 9541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.dataElement("greeting", "Hello, world!"); 9641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument(); 9741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 9841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 9941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <h2>Whitespace</h2> 10041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 10141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>According to the XML Recommendation, <em>all</em> whitespace 10241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * in an XML document is potentially significant to an application, 10341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * so this class never adds newlines or indentation. If you 10441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * insert three elements in a row, as in</p> 10541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 10641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 10741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.dataElement("item", "1"); 10841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.dataElement("item", "2"); 10941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.dataElement("item", "3"); 11041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 11141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 11241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>you will end up with</p> 11341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 11441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 11541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <item>1</item><item>3</item><item>3</item> 11641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 11741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 11841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>You need to invoke one of the <var>characters</var> methods 11941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * explicitly to add newlines or indentation. Alternatively, you 12041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * can use {@link com.megginson.sax.DataWriter DataWriter}, which 12141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * is derived from this class -- it is optimized for writing 12241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * purely data-oriented (or field-oriented) XML, and does automatic 12341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * linebreaks and indentation (but does not support mixed content 12441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * properly).</p> 12541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 12641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 12741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <h2>Namespace Support</h2> 12841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 12941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The writer contains extensive support for XML Namespaces, so that 13041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * a client application does not have to keep track of prefixes and 13141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * supply <var>xmlns</var> attributes. By default, the XML writer will 13241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * generate Namespace declarations in the form _NS1, _NS2, etc., wherever 13341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * they are needed, as in the following example:</p> 13441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 13541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 13641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument(); 13741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.emptyElement("http://www.foo.com/ns/", "foo"); 13841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument(); 13941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 14041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 14141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The resulting document will look like this:</p> 14241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 14341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 14441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <?xml version="1.0" standalone="yes"?> 14541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 14641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <_NS1:foo xmlns:_NS1="http://www.foo.com/ns/"/> 14741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 14841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 14941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>In many cases, document authors will prefer to choose their 15041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * own prefixes rather than using the (ugly) default names. The 15141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * XML writer allows two methods for selecting prefixes:</p> 15241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 15341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <ol> 15441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <li>the qualified name</li> 15541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <li>the {@link #setPrefix setPrefix} method.</li> 15641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </ol> 15741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 15841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Whenever the XML writer finds a new Namespace URI, it checks 15941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * to see if a qualified (prefixed) name is also available; if so 16041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * it attempts to use the name's prefix (as long as the prefix is 16141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * not already in use for another Namespace URI).</p> 16241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 16341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Before writing a document, the client can also pre-map a prefix 16441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * to a Namespace URI with the setPrefix method:</p> 16541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 16641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 16741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.setPrefix("http://www.foo.com/ns/", "foo"); 16841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument(); 16941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.emptyElement("http://www.foo.com/ns/", "foo"); 17041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument(); 17141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 17241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 17341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The resulting document will look like this:</p> 17441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 17541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 17641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <?xml version="1.0" standalone="yes"?> 17741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 17841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <foo:foo xmlns:foo="http://www.foo.com/ns/"/> 17941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 18041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 18141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The default Namespace simply uses an empty string as the prefix:</p> 18241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 18341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 18441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.setPrefix("http://www.foo.com/ns/", ""); 18541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.startDocument(); 18641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.emptyElement("http://www.foo.com/ns/", "foo"); 18741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.endDocument(); 18841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 18941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 19041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The resulting document will look like this:</p> 19141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 19241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 19341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <?xml version="1.0" standalone="yes"?> 19441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 19541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <foo xmlns="http://www.foo.com/ns/"/> 19641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 19741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 19841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>By default, the XML writer will not declare a Namespace until 19941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * it is actually used. Sometimes, this approach will create 20041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * a large number of Namespace declarations, as in the following 20141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * example:</p> 20241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 20341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 20441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <xml version="1.0" standalone="yes"?> 20541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 20641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 20741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <rdf:Description about="http://www.foo.com/ids/books/12345"> 20841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <dc:title xmlns:dc="http://www.purl.org/dc/">A Dark Night</dc:title> 20941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <dc:creator xmlns:dc="http://www.purl.org/dc/">Jane Smith</dc:title> 21041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <dc:date xmlns:dc="http://www.purl.org/dc/">2000-09-09</dc:title> 21141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </rdf:Description> 21241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </rdf:RDF> 21341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 21441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 21541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>The "rdf" prefix is declared only once, because the RDF Namespace 21641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * is used by the root element and can be inherited by all of its 21741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * descendants; the "dc" prefix, on the other hand, is declared three 21841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * times, because no higher element uses the Namespace. To solve this 21941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * problem, you can instruct the XML writer to predeclare Namespaces 22041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * on the root element even if they are not used there:</p> 22141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 22241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 22341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * w.forceNSDecl("http://www.purl.org/dc/"); 22441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 22541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 22641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Now, the "dc" prefix will be declared on the root element even 22741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * though it's not needed there, and can be inherited by its 22841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * descendants:</p> 22941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 23041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <pre> 23141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <xml version="1.0" standalone="yes"?> 23241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 23341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 23441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * xmlns:dc="http://www.purl.org/dc/"> 23541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <rdf:Description about="http://www.foo.com/ids/books/12345"> 23641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <dc:title>A Dark Night</dc:title> 23741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <dc:creator>Jane Smith</dc:title> 23841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <dc:date>2000-09-09</dc:title> 23941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </rdf:Description> 24041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </rdf:RDF> 24141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * </pre> 24241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 24341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This approach is also useful for declaring Namespace prefixes 24441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * that be used by qualified names appearing in attribute values or 24541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * character data.</p> 24641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 24741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @author David Megginson, david@megginson.com 24841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @version 0.2 24941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.XMLFilter 25041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.ContentHandler 25141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 25241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Projectpublic class XMLWriter extends XMLFilterImpl implements LexicalHandler 25341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project{ 25441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 25541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 25641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 25741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Constructors. 25841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 25941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 26041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 26141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 26241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Create a new XML writer. 26341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 26441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Write to standard output.</p> 26541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 26641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public XMLWriter () 26741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 26841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project init(null); 26941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 27041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 27141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 27241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 27341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Create a new XML writer. 27441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 27541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Write to the writer provided.</p> 27641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 27741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param writer The output destination, or null to use standard 27841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * output. 27941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 28041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public XMLWriter (Writer writer) 28141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 28241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project init(writer); 28341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 28441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 28541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 28641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 28741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Create a new XML writer. 28841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 28941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Use the specified XML reader as the parent.</p> 29041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 29141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param xmlreader The parent in the filter chain, or null 29241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * for no parent. 29341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 29441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public XMLWriter (XMLReader xmlreader) 29541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 29641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super(xmlreader); 29741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project init(null); 29841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 29941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 30041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 30141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 30241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Create a new XML writer. 30341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 30441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Use the specified XML reader as the parent, and write 30541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * to the specified writer.</p> 30641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 30741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param xmlreader The parent in the filter chain, or null 30841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * for no parent. 30941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param writer The output destination, or null to use standard 31041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * output. 31141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 31241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public XMLWriter (XMLReader xmlreader, Writer writer) 31341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 31441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super(xmlreader); 31541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project init(writer); 31641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 31741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 31841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 31941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 32041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Internal initialization method. 32141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 32241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>All of the public constructors invoke this method. 32341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 32441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param writer The output destination, or null to use 32541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * standard output. 32641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 32741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private void init (Writer writer) 32841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 32941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project setOutput(writer); 33041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project nsSupport = new NamespaceSupport(); 33141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefixTable = new Hashtable(); 33241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project forcedDeclTable = new Hashtable(); 33341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project doneDeclTable = new Hashtable(); 33441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project outputProperties = new Properties(); 33541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 33641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 33741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 33841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 33941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 34041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Public methods. 34141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 34241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 34341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 34441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 34541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Reset the writer. 34641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 34741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method is especially useful if the writer throws an 34841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * exception before it is finished, and you want to reuse the 34941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writer for a new document. It is usually a good idea to 35041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * invoke {@link #flush flush} before resetting the writer, 35141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * to make sure that no output is lost.</p> 35241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 35341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method is invoked automatically by the 35441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #startDocument startDocument} method before writing 35541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * a new document.</p> 35641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 35741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p><strong>Note:</strong> this method will <em>not</em> 35841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * clear the prefix or URI information in the writer or 35941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the selected output writer.</p> 36041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 36141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #flush 36241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 36341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void reset () 36441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 36541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project elementLevel = 0; 36641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefixCounter = 0; 36741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project nsSupport.reset(); 36841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 36941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 37041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 37141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 37241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Flush the output. 37341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 37441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method flushes the output stream. It is especially useful 37541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * when you need to make certain that the entire document has 37641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * been written to output but do not want to close the output 37741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * stream.</p> 37841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 37941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method is invoked automatically by the 38041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #endDocument endDocument} method after writing a 38141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * document.</p> 38241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 38341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #reset 38441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 38541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void flush () 38641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws IOException 38741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 38841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project output.flush(); 38941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 39041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 39141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 39241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 39341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Set a new output destination for the document. 39441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 39541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param writer The output destination, or null to use 39641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * standard output. 39741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @return The current output writer. 39841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #flush 39941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 40041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void setOutput (Writer writer) 40141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 40241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (writer == null) { 40341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project output = new OutputStreamWriter(System.out); 40441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } else { 40541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project output = writer; 40641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 40741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 40841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 40941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 41041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 41141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Specify a preferred prefix for a Namespace URI. 41241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 41341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>Note that this method does not actually force the Namespace 41441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * to be declared; to do that, use the {@link 41541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * #forceNSDecl(java.lang.String) forceNSDecl} method as well.</p> 41641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 41741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The Namespace URI. 41841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param prefix The preferred prefix, or "" to select 41941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the default Namespace. 42041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #getPrefix 42141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #forceNSDecl(java.lang.String) 42241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #forceNSDecl(java.lang.String,java.lang.String) 42341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 42441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void setPrefix (String uri, String prefix) 42541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 42641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefixTable.put(uri, prefix); 42741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 42841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 42941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 43041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 43141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Get the current or preferred prefix for a Namespace URI. 43241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 43341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The Namespace URI. 43441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @return The preferred prefix, or "" for the default Namespace. 43541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #setPrefix 43641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 43741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public String getPrefix (String uri) 43841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 43941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project return (String)prefixTable.get(uri); 44041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 44141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 44241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 44341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 44441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Force a Namespace to be declared on the root element. 44541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 44641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>By default, the XMLWriter will declare only the Namespaces 44741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * needed for an element; as a result, a Namespace may be 44841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * declared many places in a document if it is not used on the 44941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * root element.</p> 45041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 45141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method forces a Namespace to be declared on the root 45241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * element even if it is not used there, and reduces the number 45341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * of xmlns attributes in the document.</p> 45441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 45541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The Namespace URI to declare. 45641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #forceNSDecl(java.lang.String,java.lang.String) 45741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #setPrefix 45841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 45941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void forceNSDecl (String uri) 46041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 46141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project forcedDeclTable.put(uri, Boolean.TRUE); 46241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 46341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 46441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 46541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 46641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Force a Namespace declaration with a preferred prefix. 46741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 46841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This is a convenience method that invokes {@link 46941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * #setPrefix setPrefix} then {@link #forceNSDecl(java.lang.String) 47041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * forceNSDecl}.</p> 47141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 47241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The Namespace URI to declare on the root element. 47341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param prefix The preferred prefix for the Namespace, or "" 47441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * for the default Namespace. 47541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #setPrefix 47641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #forceNSDecl(java.lang.String) 47741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 47841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void forceNSDecl (String uri, String prefix) 47941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 48041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project setPrefix(uri, prefix); 48141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project forceNSDecl(uri); 48241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 48341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 48441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 48541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 48641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 48741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Methods from org.xml.sax.ContentHandler. 48841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 48941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 49041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 49141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 49241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write the XML declaration at the beginning of the document. 49341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 49441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Pass the event on down the filter chain for further processing. 49541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 49641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 49741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the XML declaration, or if a handler further down 49841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 49941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.ContentHandler#startDocument 50041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 50141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void startDocument () 50241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 50341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 50441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project reset(); 50541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (!("yes".equals(outputProperties.getProperty(OMIT_XML_DECLARATION, "no")))) { 50641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("<?xml"); 50741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (version == null) { 50841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(" version=\"1.0\""); 50941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } else { 51041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(" version=\""); 51141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(version); 51241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("\""); 51341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 51441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (outputEncoding != null && outputEncoding != "") { 51541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(" encoding=\""); 51641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(outputEncoding); 51741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("\""); 51841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 51941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (standalone == null) { 52041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(" standalone=\"yes\"?>\n"); 52141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } else { 52241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(" standalone=\""); 52341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(standalone); 52441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("\""); 52541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 52641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 52741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super.startDocument(); 52841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 52941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 53041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 53141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 53241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write a newline at the end of the document. 53341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 53441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Pass the event on down the filter chain for further processing. 53541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 53641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 53741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the newline, or if a handler further down 53841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 53941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.ContentHandler#endDocument 54041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 54141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void endDocument () 54241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 54341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 54441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('\n'); 54541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super.endDocument(); 54641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project try { 54741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project flush(); 54841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } catch (IOException e) { 54941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throw new SAXException(e); 55041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 55141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 55241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 55341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 55441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 55541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write a start tag. 55641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 55741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Pass the event on down the filter chain for further processing. 55841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 55941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The Namespace URI, or the empty string if none 56041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * is available. 56141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local (unprefixed) name (required). 56241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param qName The element's qualified (prefixed) name, or the 56341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * empty string is none is available. This method will 56441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * use the qName as a template for generating a prefix 56541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * if necessary, but it is not guaranteed to use the 56641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * same qName. 56741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param atts The element's attribute list (must not be null). 56841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 56941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the start tag, or if a handler further down 57041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 57141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.ContentHandler#startElement 57241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 57341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void startElement (String uri, String localName, 57441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String qName, Attributes atts) 57541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 57641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 57741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project elementLevel++; 57841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project nsSupport.pushContext(); 57941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (forceDTD && !hasOutputDTD) startDTD(localName == null ? qName : localName, "", ""); 58041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('<'); 58141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeName(uri, localName, qName, true); 58241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeAttributes(atts); 58341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (elementLevel == 1) { 58441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project forceNSDecls(); 58541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 58641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeNSDecls(); 58741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('>'); 58841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// System.out.println("%%%% startElement [" + qName + "] htmlMode = " + htmlMode); 58941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (htmlMode && (qName.equals("script") || qName.equals("style"))) { 59041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project cdataElement = true; 59141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// System.out.println("%%%% CDATA element"); 59241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 59341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super.startElement(uri, localName, qName, atts); 59441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 59541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 59641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 59741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 59841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write an end tag. 59941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 60041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Pass the event on down the filter chain for further processing. 60141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 60241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The Namespace URI, or the empty string if none 60341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * is available. 60441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local (unprefixed) name (required). 60541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param qName The element's qualified (prefixed) name, or the 60641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * empty string is none is available. This method will 60741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * use the qName as a template for generating a prefix 60841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * if necessary, but it is not guaranteed to use the 60941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * same qName. 61041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 61141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the end tag, or if a handler further down 61241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 61341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.ContentHandler#endElement 61441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 61541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void endElement (String uri, String localName, String qName) 61641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 61741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 61841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (!(htmlMode && 61941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project (uri.equals("http://www.w3.org/1999/xhtml") || 62041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project uri.equals("")) && 62141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project (qName.equals("area") || qName.equals("base") || 62241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project qName.equals("basefont") || qName.equals("br") || 62341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project qName.equals("col") || qName.equals("frame") || 62441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project qName.equals("hr") || qName.equals("img") || 62541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project qName.equals("input") || qName.equals("isindex") || 62641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project qName.equals("link") || qName.equals("meta") || 62741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project qName.equals("param")))) { 62841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("</"); 62941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeName(uri, localName, qName, true); 63041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('>'); 63141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 63241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (elementLevel == 1) { 63341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('\n'); 63441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 63541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project cdataElement = false; 63641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super.endElement(uri, localName, qName); 63741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project nsSupport.popContext(); 63841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project elementLevel--; 63941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 64041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 64141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 64241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 64341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write character data. 64441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 64541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Pass the event on down the filter chain for further processing. 64641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 64741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param ch The array of characters to write. 64841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param start The starting position in the array. 64941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param length The number of characters to write. 65041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 65141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the characters, or if a handler further down 65241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 65341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.ContentHandler#characters 65441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 65541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void characters (char ch[], int start, int len) 65641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 65741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 65841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (!cdataElement) { 65941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeEsc(ch, start, len, false); 66041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 66141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project else { 66241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project for (int i = start; i < start + len; i++) { 66341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(ch[i]); 66441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 66541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 66641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super.characters(ch, start, len); 66741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 66841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 66941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 67041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 67141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write ignorable whitespace. 67241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 67341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Pass the event on down the filter chain for further processing. 67441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 67541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param ch The array of characters to write. 67641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param start The starting position in the array. 67741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param length The number of characters to write. 67841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 67941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the whitespace, or if a handler further down 68041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 68141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.ContentHandler#ignorableWhitespace 68241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 68341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void ignorableWhitespace (char ch[], int start, int length) 68441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 68541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 68641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeEsc(ch, start, length, false); 68741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super.ignorableWhitespace(ch, start, length); 68841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 68941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 69041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 69141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 69241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 69341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write a processing instruction. 69441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 69541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Pass the event on down the filter chain for further processing. 69641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 69741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param target The PI target. 69841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param data The PI data. 69941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 70041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the PI, or if a handler further down 70141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 70241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see org.xml.sax.ContentHandler#processingInstruction 70341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 70441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void processingInstruction (String target, String data) 70541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 70641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 70741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("<?"); 70841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(target); 70941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(' '); 71041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(data); 71141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("?>"); 71241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (elementLevel < 1) { 71341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('\n'); 71441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 71541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super.processingInstruction(target, data); 71641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 71741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 71841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 71941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 72041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 72141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Additional markup. 72241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 72341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 72441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 72541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write an empty element. 72641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 72741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * This method writes an empty element tag rather than a start tag 72841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * followed by an end tag. Both a {@link #startElement 72941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * startElement} and an {@link #endElement endElement} event will 73041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * be passed on down the filter chain. 73141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 73241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The element's Namespace URI, or the empty string 73341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * if the element has no Namespace or if Namespace 73441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * processing is not being performed. 73541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name (without prefix). This 73641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * parameter must be provided. 73741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param qName The element's qualified name (with prefix), or 73841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the empty string if none is available. This parameter 73941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * is strictly advisory: the writer may or may not use 74041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the prefix attached. 74141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param atts The element's attribute list. 74241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 74341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the empty tag, or if a handler further down 74441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 74541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #startElement 74641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #endElement 74741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 74841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void emptyElement (String uri, String localName, 74941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String qName, Attributes atts) 75041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 75141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 75241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project nsSupport.pushContext(); 75341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('<'); 75441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeName(uri, localName, qName, true); 75541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeAttributes(atts); 75641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (elementLevel == 1) { 75741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project forceNSDecls(); 75841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 75941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeNSDecls(); 76041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("/>"); 76141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super.startElement(uri, localName, qName, atts); 76241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project super.endElement(uri, localName, qName); 76341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 76441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 76541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 76641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 76741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 76841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Convenience methods. 76941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 77041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 77141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 77241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 77341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 77441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Start a new element without a qname or attributes. 77541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 77641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method will provide a default empty attribute 77741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * list and an empty string for the qualified name. 77841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * It invokes {@link 77941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * #startElement(String, String, String, Attributes)} 78041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * directly.</p> 78141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 78241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The element's Namespace URI. 78341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name. 78441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 78541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the start tag, or if a handler further down 78641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 78741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #startElement(String, String, String, Attributes) 78841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 78941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void startElement (String uri, String localName) 79041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 79141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 79241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project startElement(uri, localName, "", EMPTY_ATTS); 79341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 79441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 79541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 79641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 79741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Start a new element without a qname, attributes or a Namespace URI. 79841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 79941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method will provide an empty string for the 80041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Namespace URI, and empty string for the qualified name, 80141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * and a default empty attribute list. It invokes 80241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * #startElement(String, String, String, Attributes)} 80341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * directly.</p> 80441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 80541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name. 80641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 80741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the start tag, or if a handler further down 80841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 80941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #startElement(String, String, String, Attributes) 81041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 81141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void startElement (String localName) 81241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 81341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 81441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project startElement("", localName, "", EMPTY_ATTS); 81541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 81641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 81741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 81841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 81941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * End an element without a qname. 82041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 82141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method will supply an empty string for the qName. 82241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * It invokes {@link #endElement(String, String, String)} 82341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * directly.</p> 82441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 82541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The element's Namespace URI. 82641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name. 82741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 82841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the end tag, or if a handler further down 82941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 83041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #endElement(String, String, String) 83141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 83241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void endElement (String uri, String localName) 83341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 83441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 83541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project endElement(uri, localName, ""); 83641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 83741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 83841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 83941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 84041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * End an element without a Namespace URI or qname. 84141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 84241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method will supply an empty string for the qName 84341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * and an empty string for the Namespace URI. 84441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * It invokes {@link #endElement(String, String, String)} 84541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * directly.</p> 84641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 84741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name. 84841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 84941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the end tag, or if a handler further down 85041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 85141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #endElement(String, String, String) 85241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 85341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void endElement (String localName) 85441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 85541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 85641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project endElement("", localName, ""); 85741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 85841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 85941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 86041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 86141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Add an empty element without a qname or attributes. 86241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 86341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method will supply an empty string for the qname 86441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * and an empty attribute list. It invokes 86541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #emptyElement(String, String, String, Attributes)} 86641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * directly.</p> 86741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 86841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The element's Namespace URI. 86941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name. 87041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 87141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the empty tag, or if a handler further down 87241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 87341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #emptyElement(String, String, String, Attributes) 87441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 87541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void emptyElement (String uri, String localName) 87641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 87741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 87841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project emptyElement(uri, localName, "", EMPTY_ATTS); 87941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 88041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 88141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 88241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 88341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Add an empty element without a Namespace URI, qname or attributes. 88441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 88541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method will supply an empty string for the qname, 88641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * and empty string for the Namespace URI, and an empty 88741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * attribute list. It invokes 88841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #emptyElement(String, String, String, Attributes)} 88941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * directly.</p> 89041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 89141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name. 89241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 89341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the empty tag, or if a handler further down 89441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 89541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #emptyElement(String, String, String, Attributes) 89641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 89741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void emptyElement (String localName) 89841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 89941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 90041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project emptyElement("", localName, "", EMPTY_ATTS); 90141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 90241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 90341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 90441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 90541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write an element with character data content. 90641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 90741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This is a convenience method to write a complete element 90841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * with character data content, including the start tag 90941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * and end tag.</p> 91041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 91141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method invokes 91241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #startElement(String, String, String, Attributes)}, 91341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * followed by 91441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #characters(String)}, followed by 91541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #endElement(String, String, String)}.</p> 91641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 91741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The element's Namespace URI. 91841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name. 91941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param qName The element's default qualified name. 92041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param atts The element's attributes. 92141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param content The character data content. 92241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 92341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the empty tag, or if a handler further down 92441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 92541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #startElement(String, String, String, Attributes) 92641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #characters(String) 92741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #endElement(String, String, String) 92841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 92941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void dataElement (String uri, String localName, 93041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String qName, Attributes atts, 93141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String content) 93241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 93341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 93441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project startElement(uri, localName, qName, atts); 93541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project characters(content); 93641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project endElement(uri, localName, qName); 93741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 93841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 93941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 94041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 94141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write an element with character data content but no attributes. 94241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 94341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This is a convenience method to write a complete element 94441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * with character data content, including the start tag 94541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * and end tag. This method provides an empty string 94641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * for the qname and an empty attribute list.</p> 94741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 94841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method invokes 94941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #startElement(String, String, String, Attributes)}, 95041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * followed by 95141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #characters(String)}, followed by 95241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #endElement(String, String, String)}.</p> 95341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 95441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The element's Namespace URI. 95541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name. 95641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param content The character data content. 95741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 95841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the empty tag, or if a handler further down 95941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 96041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #startElement(String, String, String, Attributes) 96141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #characters(String) 96241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #endElement(String, String, String) 96341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 96441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void dataElement (String uri, String localName, String content) 96541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 96641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 96741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project dataElement(uri, localName, "", EMPTY_ATTS, content); 96841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 96941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 97041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 97141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 97241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write an element with character data content but no attributes or Namespace URI. 97341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 97441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This is a convenience method to write a complete element 97541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * with character data content, including the start tag 97641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * and end tag. The method provides an empty string for the 97741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Namespace URI, and empty string for the qualified name, 97841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * and an empty attribute list.</p> 97941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 98041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This method invokes 98141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #startElement(String, String, String, Attributes)}, 98241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * followed by 98341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #characters(String)}, followed by 98441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #endElement(String, String, String)}.</p> 98541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 98641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The element's local name. 98741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param content The character data content. 98841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 98941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the empty tag, or if a handler further down 99041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 99141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #startElement(String, String, String, Attributes) 99241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #characters(String) 99341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #endElement(String, String, String) 99441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 99541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void dataElement (String localName, String content) 99641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 99741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 99841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project dataElement("", localName, "", EMPTY_ATTS, content); 99941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 100041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 100141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 100241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 100341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write a string of character data, with XML escaping. 100441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 100541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * <p>This is a convenience method that takes an XML 100641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * String, converts it to a character array, then invokes 100741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * {@link #characters(char[], int, int)}.</p> 100841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 100941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param data The character data. 101041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error 101141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * writing the string, or if a handler further down 101241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the filter chain raises an exception. 101341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @see #characters(char[], int, int) 101441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 101541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void characters (String data) 101641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 101741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 101841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project char ch[] = data.toCharArray(); 101941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project characters(ch, 0, ch.length); 102041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 102141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 102241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 102341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 102441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 102541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Internal methods. 102641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 102741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 102841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 102941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 103041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Force all Namespaces to be declared. 103141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 103241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * This method is used on the root element to ensure that 103341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the predeclared Namespaces all appear. 103441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 103541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private void forceNSDecls () 103641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 103741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project Enumeration prefixes = forcedDeclTable.keys(); 103841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project while (prefixes.hasMoreElements()) { 103941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String prefix = (String)prefixes.nextElement(); 104041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project doPrefix(prefix, null, true); 104141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 104241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 104341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 104441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 104541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 104641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Determine the prefix for an element or attribute name. 104741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 104841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * TODO: this method probably needs some cleanup. 104941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 105041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The Namespace URI. 105141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param qName The qualified name (optional); this will be used 105241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * to indicate the preferred prefix if none is currently 105341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * bound. 105441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param isElement true if this is an element name, false 105541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * if it is an attribute name (which cannot use the 105641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * default Namespace). 105741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 105841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private String doPrefix (String uri, String qName, boolean isElement) 105941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 106041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String defaultNS = nsSupport.getURI(""); 106141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if ("".equals(uri)) { 106241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (isElement && defaultNS != null) 106341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project nsSupport.declarePrefix("", ""); 106441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project return null; 106541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 106641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String prefix; 106741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (isElement && defaultNS != null && uri.equals(defaultNS)) { 106841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix = ""; 106941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } else { 107041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix = nsSupport.getPrefix(uri); 107141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 107241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (prefix != null) { 107341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project return prefix; 107441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 107541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix = (String) doneDeclTable.get(uri); 107641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (prefix != null && 107741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project ((!isElement || defaultNS != null) && 107841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project "".equals(prefix) || nsSupport.getURI(prefix) != null)) { 107941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix = null; 108041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 108141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (prefix == null) { 108241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix = (String) prefixTable.get(uri); 108341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (prefix != null && 108441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project ((!isElement || defaultNS != null) && 108541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project "".equals(prefix) || nsSupport.getURI(prefix) != null)) { 108641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix = null; 108741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 108841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 108941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (prefix == null && qName != null && !"".equals(qName)) { 109041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project int i = qName.indexOf(':'); 109141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (i == -1) { 109241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (isElement && defaultNS == null) { 109341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix = ""; 109441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 109541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } else { 109641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix = qName.substring(0, i); 109741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 109841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 109941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project for (; 110041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix == null || nsSupport.getURI(prefix) != null; 110141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project prefix = "__NS" + ++prefixCounter) 110241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project ; 110341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project nsSupport.declarePrefix(prefix, uri); 110441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project doneDeclTable.put(uri, prefix); 110541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project return prefix; 110641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 110741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 110841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 110941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 111041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write a raw character. 111141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 111241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param c The character to write. 111341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error writing 111441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the character, this method will throw an IOException 111541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * wrapped in a SAXException. 111641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 111741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private void write (char c) 111841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 111941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 112041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project try { 112141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project output.write(c); 112241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } catch (IOException e) { 112341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throw new SAXException(e); 112441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 112541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 112641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 112741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 112841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 112941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write a raw string. 113041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 113141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param s 113241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException If there is an error writing 113341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the string, this method will throw an IOException 113441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * wrapped in a SAXException 113541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 113641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private void write (String s) 113741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 113841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 113941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project try { 114041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project output.write(s); 114141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } catch (IOException e) { 114241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throw new SAXException(e); 114341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 114441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 114541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 114641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 114741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 114841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write out an attribute list, escaping values. 114941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 115041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * The names will have prefixes added to them. 115141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 115241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param atts The attribute list to write. 115341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.SAXException If there is an error writing 115441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the attribute list, this method will throw an 115541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * IOException wrapped in a SAXException. 115641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 115741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private void writeAttributes (Attributes atts) 115841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 115941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 116041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project int len = atts.getLength(); 116141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project for (int i = 0; i < len; i++) { 116241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project char ch[] = atts.getValue(i).toCharArray(); 116341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(' '); 116441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeName(atts.getURI(i), atts.getLocalName(i), 116541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project atts.getQName(i), false); 116641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (htmlMode && 116741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project booleanAttribute(atts.getLocalName(i), atts.getQName(i), atts.getValue(i))) break; 116841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("=\""); 116941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeEsc(ch, 0, ch.length, true); 117041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('"'); 117141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 117241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 117341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 117441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 117541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private String[] booleans = {"checked", "compact", "declare", "defer", 117641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project "disabled", "ismap", "multiple", 117741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project "nohref", "noresize", "noshade", 117841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project "nowrap", "readonly", "selected"}; 117941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 118041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Return true if the attribute is an HTML boolean from the above list. 118141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private boolean booleanAttribute (String localName, String qName, String value) 118241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 118341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String name = localName; 118441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (name == null) { 118541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project int i = qName.indexOf(':'); 118641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (i != -1) name = qName.substring(i + 1, qName.length()); 118741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 118841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (!name.equals(value)) return false; 118941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project for (int j = 0; j < booleans.length; j++) { 119041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (name.equals(booleans[j])) return true; 119141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 119241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project return false; 119341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 119441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 119541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 119641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write an array of data characters with escaping. 119741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 119841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param ch The array of characters. 119941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param start The starting position. 120041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param length The number of characters to use. 120141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param isAttVal true if this is an attribute value literal. 120241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.SAXException If there is an error writing 120341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * the characters, this method will throw an 120441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * IOException wrapped in a SAXException. 120541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 120641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private void writeEsc (char ch[], int start, 120741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project int length, boolean isAttVal) 120841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 120941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 121041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project for (int i = start; i < start + length; i++) { 121141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project switch (ch[i]) { 121241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case '&': 121341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("&"); 121441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 121541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case '<': 121641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("<"); 121741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 121841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case '>': 121941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(">"); 122041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 122141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project case '\"': 122241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (isAttVal) { 122341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("""); 122441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } else { 122541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('\"'); 122641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 122741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project break; 122841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project default: 122941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (!unicodeMode && ch[i] > '\u007f') { 123041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("&#"); 123141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(Integer.toString(ch[i])); 123241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(';'); 123341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } else { 123441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(ch[i]); 123541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 123641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 123741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 123841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 123941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 124041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 124141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 124241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write out the list of Namespace declarations. 124341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 124441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException This method will throw 124541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * an IOException wrapped in a SAXException if 124641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * there is an error writing the Namespace 124741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * declarations. 124841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 124941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private void writeNSDecls () 125041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 125141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 125241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project Enumeration prefixes = nsSupport.getDeclaredPrefixes(); 125341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project while (prefixes.hasMoreElements()) { 125441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String prefix = (String) prefixes.nextElement(); 125541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String uri = nsSupport.getURI(prefix); 125641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (uri == null) { 125741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project uri = ""; 125841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 125941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project char ch[] = uri.toCharArray(); 126041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(' '); 126141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if ("".equals(prefix)) { 126241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("xmlns=\""); 126341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } else { 126441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("xmlns:"); 126541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(prefix); 126641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("=\""); 126741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 126841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project writeEsc(ch, 0, ch.length, true); 126941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write('\"'); 127041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 127141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 127241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 127341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 127441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project /** 127541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * Write an element or attribute name. 127641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * 127741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param uri The Namespace URI. 127841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param localName The local name. 127941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param qName The prefixed name, if available, or the empty string. 128041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @param isElement true if this is an element name, false if it 128141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * is an attribute name. 128241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * @exception org.xml.sax.SAXException This method will throw an 128341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * IOException wrapped in a SAXException if there is 128441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project * an error writing the name. 128541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project */ 128641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private void writeName (String uri, String localName, 128741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String qName, boolean isElement) 128841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project throws SAXException 128941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 129041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project String prefix = doPrefix(uri, qName, isElement); 129141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (prefix != null && !"".equals(prefix)) { 129241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(prefix); 129341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(':'); 129441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 129541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (localName != null && !"".equals(localName)) { 129641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(localName); 129741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } else { 129841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project int i = qName.indexOf(':'); 129941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(qName.substring(i + 1, qName.length())); 130041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 130141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 130241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 130341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 130441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 130541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 130641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Default LexicalHandler implementation 130741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 130841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 130941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void comment(char[] ch, int start, int length) throws SAXException 131041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project { 131141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("<!--"); 131241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project for (int i = start; i < start + length; i++) { 131341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(ch[i]); 131441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (ch[i] == '-' && i + 1 <= start + length && ch[i+1] == '-') 131541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(' '); 131641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 131741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("-->"); 131841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 131941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 132041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void endCDATA() throws SAXException { } 132141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void endDTD() throws SAXException { } 132241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void endEntity(String name) throws SAXException { } 132341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void startCDATA() throws SAXException { } 132441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void startDTD(String name, String publicid, String systemid) throws SAXException { 132541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (name == null) return; // can't cope 132641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (hasOutputDTD) return; // only one DTD 132741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project hasOutputDTD = true; 132841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write("<!DOCTYPE "); 132941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(name); 133041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (systemid == null) systemid = ""; 133141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (overrideSystem != null) systemid = overrideSystem; 133241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project char sysquote = (systemid.indexOf('"') != -1) ? '\'': '"'; 133341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (overridePublic != null) publicid = overridePublic; 133441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (!(publicid == null || "".equals(publicid))) { 133541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project char pubquote = (publicid.indexOf('"') != -1) ? '\'': '"'; 133641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(" PUBLIC "); 133741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(pubquote); 133841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(publicid); 133941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(pubquote); 134041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(' '); 134141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 134241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project else { 134341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(" SYSTEM "); 134441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 134541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(sysquote); 134641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(systemid); 134741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(sysquote); 134841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project write(">\n"); 134941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 135041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 135141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void startEntity(String name) throws SAXException { } 135241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 135341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 135441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 135541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Output properties 135641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 135741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 135841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public String getOutputProperty(String key) { 135941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project return outputProperties.getProperty(key); 136041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 136141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 136241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public void setOutputProperty(String key, String value) { 136341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project outputProperties.setProperty(key, value); 136441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// System.out.println("%%%% key = [" + key + "] value = [" + value +"]"); 136541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project if (key.equals(ENCODING)) { 136641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project outputEncoding = value; 136741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project unicodeMode = value.substring(0, 3).equalsIgnoreCase("utf"); 136841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// System.out.println("%%%% unicodeMode = " + unicodeMode); 136941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 137041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project else if (key.equals(METHOD)) { 137141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project htmlMode = value.equals("html"); 137241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 137341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project else if (key.equals(DOCTYPE_PUBLIC)) { 137441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project overridePublic = value; 137541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project forceDTD = true; 137641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 137741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project else if (key.equals(DOCTYPE_SYSTEM)) { 137841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project overrideSystem = value; 137941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project forceDTD = true; 138041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 138141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project else if (key.equals(VERSION)) { 138241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project version = value; 138341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 138441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project else if (key.equals(STANDALONE)) { 138541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project standalone = value; 138641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 138741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// System.out.println("%%%% htmlMode = " + htmlMode); 138841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project } 138941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 139041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 139141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 139241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Constants. 139341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 139441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 139541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private final Attributes EMPTY_ATTS = new AttributesImpl(); 139641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String CDATA_SECTION_ELEMENTS = 139741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project "cdata-section-elements"; 139841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String DOCTYPE_PUBLIC = "doctype-public"; 139941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String DOCTYPE_SYSTEM = "doctype-system"; 140041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String ENCODING = "encoding"; 140141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String INDENT = "indent"; // currently ignored 140241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String MEDIA_TYPE = "media-type"; // currently ignored 140341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String METHOD = "method"; // currently html or xml 140441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String OMIT_XML_DECLARATION = "omit-xml-declaration"; 140541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String STANDALONE = "standalone"; // currently ignored 140641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project public static final String VERSION = "version"; 140741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 140841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 140941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 141041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 141141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project // Internal state. 141241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project //////////////////////////////////////////////////////////////////// 141341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 141441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private Hashtable prefixTable; 141541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private Hashtable forcedDeclTable; 141641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private Hashtable doneDeclTable; 141741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private int elementLevel = 0; 141841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private Writer output; 141941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private NamespaceSupport nsSupport; 142041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private int prefixCounter = 0; 142141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private Properties outputProperties; 142241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private boolean unicodeMode = false; 142341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private String outputEncoding = ""; 142441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private boolean htmlMode = false; 142541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private boolean forceDTD = false; 142641cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private boolean hasOutputDTD = false; 142741cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private String overridePublic = null; 142841cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private String overrideSystem = null; 142941cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private String version = null; 143041cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private String standalone = null; 143141cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project private boolean cdataElement = false; 143241cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 143341cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project} 143441cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project 143541cdf40d933f4029c37cf844f8cf3314114e4e0aThe Android Open Source Project// end of XMLWriter.java 1436