Powered by SmartDoc

The java.sax option

The java.sax option has the same effect as having both the java.sax.input and java.sax.output options. In other words, Relaxer objects with the java.sax option can be generated by SAX events and can generates SAX events for output.

Parameters

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

true
Enables SAX input facility
false
Disables SAX input faciilty

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.14.3.1[javaSaxInput.rng] is a sample schema for the java.sax.input option.

javaSax.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 the relaxer command with the java.sax.input option is as follows:

$ relaxer -java -java.sax.input javaSaxInput.rng

Because the java generator is a default generator, execution of the relaxer command shown below has the same effect:

$ relaxer -java.sax.input javaSaxInput.rng

As a result, Relaxer generates 6 files:

List 7.13.3.1.1[JavaSax.java] is a sample program for the java.sax option.

JavaSax.java
import java.io.IOException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import java.io.File;

public class JavaSax {
    public static void main(String[] args)
	throws IOException, SAXException, ParserConfigurationException {

	String filename = args[0];
	Account account = makeAccount(filename);
	printAccount(account);
	showAccount(account);
	makeSAXEvent(account);
    }

    private static Account makeAccount(String filename)
	throws IOException, SAXException, ParserConfigurationException {

	System.out.println("*** makeAccount ***");
	File file = new File(filename);
        SAXParserFactory factory = SAXParserFactory.newInstance();
	SAXParser parser = factory.newSAXParser();
	JavaSaxContentHandler handler = new JavaSaxContentHandler();
	parser.parse(file, handler);
	Account account = handler.getAccount();
	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);
    }
}

Compilation of the JavaSax is here:

$ javac JavaSax.java

Execution

List 7.13.3.2.1[javaSax.xml] is a valid XML document against the RENAX NG schema 'javaSax.rng'.

javaSax.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 JavaSax for the valid document is here:

$ java JavaSax javaSax.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>

Namespace

List 7.13.3.3.1[javaSaxNs.rng] is a sample schema for the java.sax option with the java.xml.namespace option. Namespace, which is specified by a ns attribute in the grammar, is "http://example.com/account".

javaSaxNs.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 the relaxer command with the java.sax option is as follows:

$ relaxer -java -java.sax -java.xml.namespace javaSaxInput.rng

Because the java generator is a default generator, execution of the relaxer command shown below makes same effect:

$ relaxer -java.sax -java.xml.namespace javaSax.rng

As a result, Relaxer generates 8 files:

Account.java is a Relaxer object. URelaxer.java and the RStack are fundamental utility classes. URelaxer2.java is a utility class for namespace operations. IRNSContainer.java and RNSContext.java are helper interface and object for namespace operations. IRNode.java is a helper interface for composite operation which relates the java.pattern.composite option.

Execution

List 7.13.3.5.1[javaSaxNs.xml] is an XML document for test.

javaSaxNs.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 JavaSaxNs is here:

$ java JavaSaxNs javaSaxNs.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>

List 7.13.3.5.2[javaSaxNsPrefix.xml] is an XML document for test.

javaSaxNsPrefix.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 JavaSaxNs is here:

$ java JavaSaxNs javaSaxNsPrefix.xml
java JavaSaxNs javaSaxNsPrefix.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>