Relaxer objects with the java.sax.output option can generates SAX events for output.
The java.sax.output option takes one of the following values as a parameter:
The default configuration is false
.
No parameter implies that the parameter is true
.
If you don't use the java.xml.namespace option, the java.sax option adds the following methods to Relaxer objects.
makeDocument(DocumentHandler)
makeElement(DocumentHandler)
makeAttribute(AttributeListImpl)
If you use the java.xml.namespace option, the java.sax option adds the following methods to Relaxer objects.
makeDocument(ContentHandler)
makeElement(ContentHandler)
makeAttribute(AttributesImpl)
List 7.15.3.1[javaSaxOutput.rng] is a sample schema for the java.sax.output option.
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> <start> <ref name="account"/> </start> <define name="account"> <element name="account"> <attribute name="accountNo"> <data type="token"/> </attribute> <element name="balance"> <data type="int"/> </element> <element name="owner"> <data type="token"/> </element> <optional> <ref name="address"/> </optional> <zeroOrMore> <ref name="phone"/> </zeroOrMore> </element> </define> <define name="address"> <element name="address"> <attribute name="zip"> <data type="token"/> </attribute> <text/> </element> </define> <define name="phone"> <element name="phone"> <attribute name="area"> <data type="token"/> </attribute> <data type="token"/> </element> </define> </grammar>
Execution of Relaxer with the java.sax.output option is as follows:
$ relaxer -java -java.sax.output javaSaxOutput.rng
Because the Java generator is a default generator, execution of Relaxer as shown below has the same effect:
$ relaxer -java.sax.output javaSaxOutput.rng
As a result, Relaxer generates six files:
List 7.15.3.1.1[JavaSaxOutput.java] is a sample program for the java.sax.output option.
import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; public class JavaSaxOutput { public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException { String uri = args[0]; Account account = makeAccount(uri); printAccount(account); showAccount(account); makeSAXEvent(account); } private static Account makeAccount(String uri) throws IOException, SAXException, ParserConfigurationException { System.out.println("*** makeAccount ***"); Account account = new Account(uri); return (account); } private static void printAccount(Account account) { System.out.println("*** printAccount ***"); String accountNo = account.getAccountNo(); long balance = account.getBalance(); String owner = account.getOwner(); System.out.println("AccountNo:" + accountNo); System.out.println("Balance:" + balance); System.out.println("Owner:" + owner); Address address = account.getAddress(); if (address != null) { String zip = address.getZip(); String place = address.getContent(); System.out.println("Address: [" + zip + "] " + place); } Phone[] phones = account.getPhone(); for (int i = 0;i < phones.length;i++) { Phone phone = phones[i]; String area = phone.getArea(); String number = phone.getContent(); System.out.println("Phone: [" + area + "] " + number); } } private static void showAccount(Account account) { System.out.println("*** showAccount ***"); System.out.println("XML:" + account); } private static void makeSAXEvent(Account account) throws SAXException { System.out.println("*** makeSAXEvent ***"); PrintContentHandler handler = new PrintContentHandler(); account.makeDocument(handler); } }
List 7.15.3.1.2[PrintDocumentHandler.java] is a SAX DocumentHandler to print sax events generated by Relaxer objects.
import org.xml.sax.HandlerBase; import org.xml.sax.AttributeList; public class PrintDocumentHandler extends HandlerBase { public void startDocument () { System.out.println("Start Document"); } public void endDocument () { System.out.println("End Document"); } public void startElement(String name, AttributeList atts) { System.out.println("Start Element = " + name); int size = atts.getLength(); for (int i = 0;i < size;i++) { String attrName = atts.getName(i); String attrValue = atts.getValue(i); System.out.println(" (Attr) " + attrName + " = " + attrValue); } } public void endElement(String name) { System.out.println("End Element = " + name); } public void characters(char ch[], int start, int length) { System.out.println("Text = " + new String(ch, start, length)); } }
Compilation of JavaSaxOutput.java
is shown here:
$ javac JavaSaxOutput.java
List 7.15.3.2.1[javaSaxOutput.xml] is a valid XML document with regard to the RENAX NG schema javaSaxOutput.rng.
<account accountNo="12345"> <balance>102030</balance> <owner>XML Taro</owner> <address zip="213">Yokohama</address> <phone area="123">456-7890</phone> <phone area="090">123-4567</phone> </account>
Execution of the JavaSaxOutput
for the valid document is shown here:
$ java JavaSaxOutput javaSaxOutput.xml AccountNo:12345 Balance:102030 Owner:XML Taro Address: [213] Yokohama XML:<account \ accountNo="12345"><balance>102030</balance><owner>XML \ Taro</owner><address zip="213">Yokohama</address></account> Start Document Start Element = account (Attr) accountNo = 12345 Start Element = balance Text = 102030 End Element = balance Start Element = owner Text = XML Taro End Element = owner Start Element = address (Attr) zip = 213 Text = Yokohama End Element = address End Element = account End Document
List 7.15.3.3.1[javaSaxOutputNs.rng] is a sample schema for the java.sax.output option.
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" ns="http://example.com/account"> <start> <ref name="account"/> </start> <define name="account"> <element name="account"> <attribute name="accountNo"> <data type="token"/> </attribute> <element name="balance"> <data type="int"/> </element> <element name="owner"> <data type="token"/> </element> <optional> <ref name="address"/> </optional> <zeroOrMore> <ref name="phone"/> </zeroOrMore> </element> </define> <define name="address"> <element name="address"> <attribute name="zip"> <data type="token"/> </attribute> <text/> </element> </define> <define name="phone"> <element name="phone"> <attribute name="area"> <data type="token"/> </attribute> <data type="token"/> </element> </define> </grammar>
Execution of Relaxer with the java.sax.output option is as follows:
$ relaxer -java -java.sax.output -java.xml.namespace \ javaSaxOutput.rng
Because the Java generator is a default generator, execution of Relaxer as shown below has the same effect:
$ relaxer -java.sax.output -java.xml.namespace javaSaxOutput.rng
As a result, Relaxer generates 10 files:
Account.java
is a Relaxer object.
URelaxer.java
and RStack.java
are
fundamental utility classes.
URelaxer2.java
is a utility class for namespace operations.
IRNSContainer.java
and RNSContext.java
are a
helper interface and object for namespace operations.
IRNode.java
is a helper interface for composite operations
which are related the java.pattern.composite
option.
import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; public class JavaSaxOutputNs { public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException { String uri = args[0]; Account account = makeAccount(uri); printAccount(account); showAccount(account); makeSAXEvent(account); } private static Account makeAccount(String uri) throws IOException, SAXException, ParserConfigurationException { System.out.println("*** makeAccount ***"); Account account = new Account(uri); return (account); } private static void printAccount(Account account) { System.out.println("*** printAccount ***"); String accountNo = account.getAccountNo(); long balance = account.getBalance(); String owner = account.getOwner(); System.out.println("AccountNo:" + accountNo); System.out.println("Balance:" + balance); System.out.println("Owner:" + owner); Address address = account.getAddress(); if (address != null) { String zip = address.getZip(); String place = address.getContent(); System.out.println("Address: [" + zip + "] " + place); } Phone[] phones = account.getPhone(); for (int i = 0;i < phones.length;i++) { Phone phone = phones[i]; String area = phone.getArea(); String number = phone.getContent(); System.out.println("Phone: [" + area + "] " + number); } } private static void showAccount(Account account) { System.out.println("*** showAccount ***"); System.out.println("XML:" + account); } private static void makeSAXEvent(Account account) throws SAXException { System.out.println("*** makeSAXEvent ***"); PrintContentHandler handler = new PrintContentHandler(); account.makeDocument(handler); } }
List 7.15.3.4.2[PrintContentHandler.java] is a SAX ContentHandler to print sax events generated by Relaxer objects.
import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.Attributes; public class PrintContentHandler extends DefaultHandler { public void startDocument () { System.out.println("Start Document"); } public void endDocument () { System.out.println("End Document"); } public void startPrefixMapping(String prefix, String uri) { System.out.println("Start Prefix = " + prefix + " as Ns = " + uri); } public void endPrefixMapping(String prefix) { System.out.println("End Prefix = " + prefix); } public void startElement( String namespaceURI, String localName, String qName, Attributes atts ) { System.out.println("Start Element = " + qName + "(" + namespaceURI + ", " + localName + ")"); int size = atts.getLength(); for (int i = 0;i < size;i++) { String attrName = atts.getQName(i); String attrValue = atts.getValue(i); System.out.println(" (Attr) " + attrName + " = " + attrValue); } } public void endElement( String namespaceURI, String localName, String qName ) { System.out.println("End Element = " + qName + "(" + namespaceURI + ", " + localName + ")"); } public void characters(char ch[], int start, int length) { System.out.println("Text = " + new String(ch, start, length)); } }
Compilation of JavaSaxOutputNs.java
is shown here:
$ javac JavaSaxOutputNs.java
List 7.15.3.5.1[javaSaxOutputNs.xml] is an XML document for testing.
<account xmlns="http://example.com/account" accountNo="12345"> <balance>102030</balance> <owner>XML Taro</owner> <address zip="213">Yokohama</address> <phone area="123">456-7890</phone> <phone area="090">123-4567</phone> </account>
Execution of the JavaSaxOutputNs
is shown here:
$ java JavaSaxOutputNs javaSaxOutputNs.xml AccountNo:12345 Balance:102030 Owner:XML Taro Address: [213] Yokohama XML:<account xmlns="http://example.com/account" \ accountNo="12345"><balance>102030</balance><owner>XML \ Taro</owner><address zip="213">Yokohama</address></account> Start Document Start Prefix = as Ns = http://example.com/account Start Element = account (Attr) accountNo = 12345 Start Element = balance Text = 102030 End Element = balance Start Element = owner Text = XML Taro End Element = owner Start Element = address (Attr) zip = 213 Text = Yokohama End Element = address End Element = account End Prefix = End Document
List 7.15.3.5.2[javaSaxOutputNsPrefix.xml] is an XML document for test.
<z:account xmlns:z="http://example.com/account" accountNo="12345"> <z:balance>102030</z:balance> <z:owner>XML Taro</z:owner> <z:address zip="213">Yokohama</z:address> <z:phone area="123">456-7890</z:phone> <z:phone area="090">123-4567</z:phone> </z:account>
Execution of the JavaSaxOutputNs
is here:
$ java JavaSaxOutputNs javaSaxOutputNsPrefix.xml AccountNo:12345 Balance:102030 Owner:XML Taro Address: [213] Yokohama XML:<z:account xmlns:z="http://example.com/account" \ accountNo="12345"><z:balance>102030</z:balance><z:owner>XML \ Taro</z:owner><z:address \ zip="213">Yokohama</z:address></z:account> Start Document Start Prefix = z as Ns = http://example.com/account Start Element = z:account (Attr) accountNo = 12345 Start Element = z:balance Text = 102030 End Element = z:balance Start Element = z:owner Text = XML Taro End Element = z:owner Start Element = z:address (Attr) zip = 213 Text = Yokohama End Element = z:address End Element = z:account End Prefix = z End Document