The resulting document will look like this:
<?xml version="1.0" standalone='yes'?> <_NS1:foo xmlns:_NS1="http://www.foo.com/ns/"/>
In many cases, document authors will prefer to choose their own prefixes rather than using the (ugly) default names. The XML writer allows two methods for selecting prefixes:
Whenever the XML writer finds a new Namespace URI, it checks to see if a qualified (prefixed) name is also available; if so it attempts to use the name's prefix (as long as the prefix is not already in use for another Namespace URI).
Before writing a document, the client can also pre-map a prefix to a Namespace URI with the setPrefix method:
w.setPrefix("http://www.foo.com/ns/", "foo"); w.startDocument(); w.emptyElement("http://www.foo.com/ns/", "foo"); w.endDocument();
The resulting document will look like this:
<?xml version="1.0" standalone='yes'?> <foo:foo xmlns:foo="http://www.foo.com/ns/"/>
The default Namespace simply uses an empty string as the prefix:
w.setPrefix("http://www.foo.com/ns/", ""); w.startDocument(); w.emptyElement("http://www.foo.com/ns/", "foo"); w.endDocument();
The resulting document will look like this:
<?xml version="1.0" standalone='yes'?> <foo xmlns="http://www.foo.com/ns/"/>
By default, the XML writer will not declare a Namespace until it is actually used. Sometimes, this approach will create a large number of Namespace declarations, as in the following example:
<xml version="1.0" standalone='yes'?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description about="http://www.foo.com/ids/books/12345"> <dc:title xmlns:dc="http://www.purl.org/dc/">A Dark Night</dc:title> <dc:creator xmlns:dc="http://www.purl.org/dc/">Jane Smith</dc:title> <dc:date xmlns:dc="http://www.purl.org/dc/">2000-09-09</dc:title> </rdf:Description> </rdf:RDF>
The "rdf" prefix is declared only once, because the RDF Namespace is used by the root element and can be inherited by all of its descendants; the "dc" prefix, on the other hand, is declared three times, because no higher element uses the Namespace. To solve this problem, you can instruct the XML writer to predeclare Namespaces on the root element even if they are not used there:
w.forceNSDecl("http://www.purl.org/dc/");
Now, the "dc" prefix will be declared on the root element even though it's not needed there, and can be inherited by its descendants:
<xml version="1.0" standalone='yes'?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://www.purl.org/dc/"> <rdf:Description about="http://www.foo.com/ids/books/12345"> <dc:title>A Dark Night</dc:title> <dc:creator>Jane Smith</dc:title> <dc:date>2000-09-09</dc:title> </rdf:Description> </rdf:RDF>
This approach is also useful for declaring Namespace prefixes that be used by qualified names appearing in attribute values or character data.
This mode, enabled by the "dataFormat" property, pretty-prints field-oriented XML without mixed content. All added indentation and newlines will be passed on down the filter chain (if any).
In general, all whitespace in an XML document is potentially significant, so a general-purpose XML writing tool cannot add newlines or indentation.
There is, however, a large class of XML documents where information is strictly fielded: each element contains either character data or other elements, but not both. For this special case, it is possible for a writing tool to provide automatic indentation and newlines without requiring extra work from the user. Note that this class will likely not yield appropriate results for document-oriented XML like XHTML pages, which mix character data and elements together.
This writer mode will automatically place each start tag on a new line, optionally indented if an indent step is provided (by default, there is no indentation). If an element contains other elements, the end tag will also appear on a new line with leading indentation. Consider, for example, the following code:
XmlWriter w = new XmlWriter(); w.setDataFormat(true); w.setIndentStep(2); w.startDocument(); w.startElement("Person"); w.dataElement("name", "Jane Smith"); w.dataElement("date-of-birth", "1965-05-23"); w.dataElement("citizenship", "US"); w.endElement("Person"); w.endDocument();
This code will produce the following document:
<?xml version="1.0" standalone='yes'?> <Person> <name>Jane Smith</name> <date-of-birth>1965-05-23</date-of-birth> <citizenship>US</citizenship> </Person>@see org.xml.sax.XMLFilter @see org.xml.sax.ContentHandler @author David Megginson, Jerome Louvel (contact@noelios.com)
|
|
|
|
|
|