A sample of Adding lines to the DOM Node. This sample program illustrates:
- How to override methods from DocumentHandler ( XMLDocumentHandler)
- How to turn off ignorable white spaces by overriding ignorableWhiteSpace
- How to use the SAX Locator to return row position ( line number of DOM element).
- How to attach user defined Objects to Nodes using method setUserData
This example relies on the following:
- Turning off the "fast" DOM so we can use set expansion to FULL
Method from dom.DOMAddLines Detail: |
public void ignorableWhitespace(XMLString text,
Augmentations augs) throws XNIException {
if(! NotIncludeIgnorableWhiteSpaces )
super.ignorableWhitespace( text, augs);
else
;// Ignore ignorable white spaces
}
|
public static void main(String[] argv) {
// is there anything to do?
if ( argv.length == 0 ) {
printUsage();
System.exit(1);
}
// check parameters
for ( int i = 0; i < argv.length; i++ ) {
String arg = argv[i];
// options
if ( arg.startsWith("-") ) {
if ( arg.equals("-h") ) {
printUsage();
System.exit(1);
}
if (arg.equals("-i")) {
NotIncludeIgnorableWhiteSpaces = true;
continue;
}
}
// DOMAddLine parse and print
DOMAddLines domAddExample = new DOMAddLines( arg );
Document doc = domAddExample.getDocument();
domAddExample.print( doc );
}
}
Main program entry point. |
public void print(Node node) {
// is there anything to do?
if ( node == null ) {
return;
}
String lineRowColumn = (String ) ((Node) node).getUserData("startLine");
int type = node.getNodeType();
switch ( type ) {
// print document
case Node.DOCUMENT_NODE: {
out.println( lineRowColumn + ":" + "< ?xml version=\"1.0\" encoding=\"UTF-8\"? >");
print( ((Document)node).getDocumentElement());
out.flush();
break;
}
// print element with attributes
case Node.ELEMENT_NODE: {
out.print( lineRowColumn + ":" + '< ");
out.print(node.getNodeName());
Attr attrs[] = sortAttributes(node.getAttributes());
for ( int i = 0; i < attrs.length; i++ ) {
Attr attr = attrs[i];
out.print(' ");
out.print(attr.getNodeName());
out.print("=\"");
out.print( attr.getNodeValue());
out.print('"");
}
out.print(' >");
NodeList children = node.getChildNodes();
if ( children != null ) {
int len = children.getLength();
for ( int i = 0; i < len; i++ ) {
print(children.item(i));
}
}
break;
}
// handle entity reference nodes
case Node.ENTITY_REFERENCE_NODE: {
out.print('&");
out.print(node.getNodeName());
out.print(';");
break;
}
// print cdata sections
case Node.CDATA_SECTION_NODE: {
out.print("< ![CDATA[");
out.print(node.getNodeValue());
out.print("]] >");
break;
}
// print text
case Node.TEXT_NODE: {
out.print( node.getNodeValue());
break;
}
// print processing instruction
case Node.PROCESSING_INSTRUCTION_NODE: {
out.print("< ?");
out.print(node.getNodeName());
String data = node.getNodeValue();
if ( data != null && data.length() > 0 ) {
out.print(' ");
out.print(data);
}
out.print("? >");
break;
}
}
if ( type == Node.ELEMENT_NODE ) {
out.print("< /");
out.print(node.getNodeName());
out.print(' >");
}
out.flush();
}
Prints the specified node, recursively. |
public void startDocument(XMLLocator locator,
String encoding,
NamespaceContext namespaceContext,
Augmentations augs) throws XNIException {
super.startDocument(locator, encoding, namespaceContext, augs);
this.locator = locator;
Node node = null ;
try {
node = (Node) this.getProperty( "http://apache.org/xml/properties/dom/current-element-node" );
}
catch( org.xml.sax.SAXException ex )
{
System.err.println( "except" + ex );;
}
if( node != null )
node.setUserData( "startLine", String.valueOf( locator.getLineNumber() ), null ); // Save location String into node
}
|
public void startElement(QName elementQName,
XMLAttributes attrList,
Augmentations augs) throws XNIException {
super.startElement(elementQName, attrList, augs);
Node node = null;
try {
node = (Node) this.getProperty( "http://apache.org/xml/properties/dom/current-element-node" );
//System.out.println( "The node = " + node ); TODO JEFF
}
catch( org.xml.sax.SAXException ex )
{
System.err.println( "except" + ex );;
}
if( node != null )
node.setUserData( "startLine", String.valueOf( locator.getLineNumber() ), null ); // Save location String into node
}
|