D
dmckeon
I have a Java program that creates an XML string and I wanted to pass
in a schema name to include when the DOM object is created. Here is my
Java code. The startDocument method automatically adds "<?xml
version="1.0" encoding="UTF-8"?>". Is there something I can add to
this method to write out the schema location?
package igxml;
import java.io.*;
import java.util.Vector;
import org.w3c.dom.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.*;
import org.apache.xml.serialize.*;
public class IgXMLBuild extends DefaultHandler {
Document doc;
Element root;
Element currentElement;
Element previousElement;
Element childElement;
int elementIndex;
Text textData;
private Vector elementList = new Vector();
/**
* This method is used to create a new XML document (DOM object)
* @param rootName This is the name of the Root element.
*/
public void startDocument(String rootName)
{
// Create the DOM object
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
System.out.println("Could not locate a JAXP DocumentBuilder
class");
}
doc = builder.newDocument();
/* create the root node */
root = doc.createElement(rootName);
/* Initialiaze the vector that will hold the element pointers. */
elementList.clear();
elementList.addElement(root);
currentElement = root;
return;
}
/**
* This method will create the open tag for a new element.
* @param elementName The name of the new element.
*/
public void startTag (String elementName)
{
/* create a row node */
currentElement = doc.createElement(elementName);
/* add Element ID to Vector */
elementList.addElement(currentElement);
return;
}
/**
* This method will create the end tag for the last open tag
(startTag) that was created.
* @param elementName This parameter is not used in the function. It
is for documentation purposes only.
*/
public void endTag(String elementName)
{
/* append the row node to the parent node */
elementIndex = elementList.indexOf(currentElement);
elementIndex += -1;
previousElement = (Element)elementList.get(elementIndex);
previousElement.appendChild(currentElement);
elementIndex += 1;
elementList.remove(elementIndex);
currentElement = previousElement;
}
/**
* This method is used to create an XML Open/Close tag with data
* @param elementName XML Tag Name for open/close tag
* @param elementValue Data between open/close tag
*/
public void addTag(String elementName, String elementValue)
{
childElement = doc.createElement(elementName);
textData = doc.createTextNode(elementValue);
childElement.appendChild(textData);
currentElement.appendChild(childElement);
}
/**
* This method is used to create all of the close tags for
* any tags that were opened (startTag) and not yet closed.
*/
public void closeTags(){
while (root != currentElement) {
endTag("");
currentElement = (Element)elementList.lastElement();
}
}
/**
* This method is called when you are done building the XML document.
* It will close any tags that were not yet closed.
* @return The XML document will be returned as a String.
*/
public String finishDocument()
{
closeTags();
/* append the root node to the document */
doc.appendChild(root);
try {
// Serialize the document
StringWriter out;
out = new StringWriter();
XMLSerializer serializer = new XMLSerializer(out, new
OutputFormat(doc));
serializer.serialize(doc);
String xmlString = out.toString();
return xmlString;
} catch (IOException e) {
System.err.println(e);
return e.toString();
}
}
}
in a schema name to include when the DOM object is created. Here is my
Java code. The startDocument method automatically adds "<?xml
version="1.0" encoding="UTF-8"?>". Is there something I can add to
this method to write out the schema location?
package igxml;
import java.io.*;
import java.util.Vector;
import org.w3c.dom.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.*;
import org.apache.xml.serialize.*;
public class IgXMLBuild extends DefaultHandler {
Document doc;
Element root;
Element currentElement;
Element previousElement;
Element childElement;
int elementIndex;
Text textData;
private Vector elementList = new Vector();
/**
* This method is used to create a new XML document (DOM object)
* @param rootName This is the name of the Root element.
*/
public void startDocument(String rootName)
{
// Create the DOM object
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
System.out.println("Could not locate a JAXP DocumentBuilder
class");
}
doc = builder.newDocument();
/* create the root node */
root = doc.createElement(rootName);
/* Initialiaze the vector that will hold the element pointers. */
elementList.clear();
elementList.addElement(root);
currentElement = root;
return;
}
/**
* This method will create the open tag for a new element.
* @param elementName The name of the new element.
*/
public void startTag (String elementName)
{
/* create a row node */
currentElement = doc.createElement(elementName);
/* add Element ID to Vector */
elementList.addElement(currentElement);
return;
}
/**
* This method will create the end tag for the last open tag
(startTag) that was created.
* @param elementName This parameter is not used in the function. It
is for documentation purposes only.
*/
public void endTag(String elementName)
{
/* append the row node to the parent node */
elementIndex = elementList.indexOf(currentElement);
elementIndex += -1;
previousElement = (Element)elementList.get(elementIndex);
previousElement.appendChild(currentElement);
elementIndex += 1;
elementList.remove(elementIndex);
currentElement = previousElement;
}
/**
* This method is used to create an XML Open/Close tag with data
* @param elementName XML Tag Name for open/close tag
* @param elementValue Data between open/close tag
*/
public void addTag(String elementName, String elementValue)
{
childElement = doc.createElement(elementName);
textData = doc.createTextNode(elementValue);
childElement.appendChild(textData);
currentElement.appendChild(childElement);
}
/**
* This method is used to create all of the close tags for
* any tags that were opened (startTag) and not yet closed.
*/
public void closeTags(){
while (root != currentElement) {
endTag("");
currentElement = (Element)elementList.lastElement();
}
}
/**
* This method is called when you are done building the XML document.
* It will close any tags that were not yet closed.
* @return The XML document will be returned as a String.
*/
public String finishDocument()
{
closeTags();
/* append the root node to the document */
doc.appendChild(root);
try {
// Serialize the document
StringWriter out;
out = new StringWriter();
XMLSerializer serializer = new XMLSerializer(out, new
OutputFormat(doc));
serializer.serialize(doc);
String xmlString = out.toString();
return xmlString;
} catch (IOException e) {
System.err.println(e);
return e.toString();
}
}
}