Powered by SmartDoc

The java.sax.output option

Relaxer objects with the java.sax.output option can generates SAX events for output.

Parameters

The java.sax.output option takes one of the following values as a parameter:

true
Enables the capability to generate SAX events.
false
Disables the capability to generate SAX events.

The default configuration is false. No parameter implies that the parameter is true.

Artifacts

without java.xml.namespace

If you don't use the java.xml.namespace option, the java.sax option adds the following methods to Relaxer objects.

with java.xml.namespace

If you use the java.xml.namespace option, the java.sax option adds the following methods to Relaxer objects.

Example

List 7.15.3.1[javaSaxOutput.rng] is a sample schema for the java.sax.output option.

javaSaxOutput.rng
<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>

Build

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.

JavaSaxOutput.java
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.

PrintDocumentHandler.java
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

Execution

List 7.15.3.2.1[javaSaxOutput.xml] is a valid XML document with regard to the RENAX NG schema javaSaxOutput.rng.

javaSaxOutput.xml
<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

Namespace

List 7.15.3.3.1[javaSaxOutputNs.rng] is a sample schema for the java.sax.output option.

javaSaxOutputNs.rng
<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>

Build

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.

JavaSaxOutputNs.java
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.

PrintContentHandler.java
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

Execution

List 7.15.3.5.1[javaSaxOutputNs.xml] is an XML document for testing.

javaSaxOutputNs.xml
<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.

javaSaxOutputNsPrefix.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: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