XElement provides an interface to an XML element. An XElement represents an
XML element which contains:
It is important to understand the diffrence between an "field" XElement and
a non "field" XElement. If an XElement does not contain any sub elements, it
is considered a "field" XElement. The getField(String) and
getValue() functions will throw an XElementException if they
are used on non "attribute" objects. This give you a little bit type
checking (You'll get an exception if you try to access the character data of
an element that has sub elements).
If XElement is not an field, then it contains other XElements and optionaly
some text. The text data can be accessed with the getText()
method and the sub elements with the iterator() or with
getElementXXX() fuctions. Since XML and thus XElements provide a tree
type data structure, traversing the tree to access leaf data can be
cumbersom if you have a 'deep' tree. For example, you may have to do:
element.getElement("tree").getElement("branch").getElement("leaf")
access a XElement 3 levels deep in the tree. To access deep elements easier,
XElements lets you use 'reletive' names to access deep elements. Using
reletive names, you could access the same element in previous example doing:
element.getElement("tree/branch/leaf") When using relative
names, keep in mind that "." will get the current XElement, and ".." will
get parent XElement. Very similar to how URLs work.
| Method from org.jboss.mq.xml.XElement Detail: |
public void add(String data) {
( ( StringBuffer )contents.elementAt( 0 ) ).append( data );
}
Adds and appends string data to the objects text. |
public void addElement(XElement subObject) {
contents.addElement( subObject );
subObject.parent = this;
}
Adds an XElement to the set of XElements that are contained by this
object. |
public void addField(String key,
String value) {
XElement subObject = new XElement( key );
subObject.add( value );
addElement( subObject );
}
Adds an XElement to the set of XElements that are contained by this
object. |
public boolean containsElement(String objectName) {
try {
getElement( objectName );
return true;
} catch ( XElementException e ) {
return false;
}
}
Tests to see if this object contains the specified object. |
public boolean containsField(String objectName) {
try {
XElement obj = getElement( objectName );
return obj.isField();
} catch ( XElementException e ) {
return false;
}
}
Tests to see if this object contains the specified attribute object. |
public static XElement createFrom(InputStream is) throws XElementException, IOException {
class MyRecordConsumer implements XElementConsumer {
XElement root = null;
public void documentEndEvent() {
}
public void documentStartEvent() {
}
public void recordReadEvent( XElement o ) {
root = o;
}
}
MyRecordConsumer consumer = new MyRecordConsumer();
XElementProducer producer = new XElementProducer( consumer );
try {
producer.parse( is );
if ( consumer.root == null ) {
throw new XElementException( "No root element" );
}
return consumer.root;
} catch ( java.io.IOException e ) {
throw e;
} catch ( Exception e ) {
throw new XElementException( "Parse Error: " + e );
}
}
Constructs an empty object. |
public static XElement createFrom(URL url) throws XElementException, IOException {
class MyRecordConsumer implements XElementConsumer {
XElement root = null;
public void documentEndEvent() {
}
public void documentStartEvent() {
}
public void recordReadEvent( XElement o ) {
root = o;
}
}
MyRecordConsumer consumer = new MyRecordConsumer();
XElementProducer producer = new XElementProducer( consumer );
try {
producer.parse( url );
if ( consumer.root == null ) {
throw new XElementException( "No root element" );
}
return consumer.root;
} catch ( java.io.IOException e ) {
throw e;
} catch ( Exception e ) {
throw new XElementException( "Parse Error: " + e );
}
}
Constructs an empty object. |
public Enumeration elements() {
return getElementsNamed( "*" );
}
|
public String getAttribute(String key) {
String t = ( String )metadata.get( key );
if ( t == null ) {
return "";
}
return t;
}
Returns the value of a meta data value. |
public XElement getElement(String relativeName) throws XElementException {
if ( relativeName == null ) {
throw new NullPointerException();
}
String names[] = {null, relativeName};
// Does the name have a "/" in it?
String split[] = splitFront( relativeName, "/" );
if ( split != null ) {
// was it an absolute name? (started with a '/')
if ( split[0].length() == 0 ) {
// we are the parent
if ( parent == null ) {
split[0] = null;
}
// Let my parent handle the request.
else {
return parent.getElement( relativeName );
}
}
// did we have a trailing / in the name?
if ( split[1].length() == 0 ) {
// For the case of "/",
if ( split[0].equals( null ) ) {
return this;
}
//otherwise it is an error
// to leave a trailing /, for example tree/leaf/
throw new XElementException( "Invalid name (trailing '/') : " + relativeName );
}
names = split;
}
if ( names[0] == null ) {
for ( int i = 1; i < contents.size(); i++ ) {
XElement o = ( XElement )contents.elementAt( i );
if ( names[1].equals( o.getName() ) ) {
return o;
}
}
} else {
if ( names[0].equals( "." ) ) {
return getElement( names[1] );
} else if ( names[0].equals( ".." ) ) {
if ( parent != null ) {
return parent.getElement( names[1] );
} else {
throw new XElementException( "Invalid name (" + getName() + " has no parent) : " + relativeName );
}
} else {
for ( int i = 1; i < contents.size(); i++ ) {
XElement o = ( XElement )contents.elementAt( i );
if ( names[0].equals( o.getName() ) ) {
return o.getElement( names[1] );
}
}
}
}
throw new XElementException( "Invalid name (" + getName() + " does not contain the name) : " + relativeName );
}
Returns the first object contained in this object named relativeName. |
public Enumeration getElementsNamed(String relativeName) {
Vector t = new Vector();
addElementsToVector( t, relativeName );
return t.elements();
}
Returns all the contained objects with the specified name. |
public String getField(String objectName) throws XElementException {
return getElement( objectName ).getValue();
}
Gets the value of a contained attribute object. |
public String getName() {
return name;
}
Returns the element name (tag name) of this XElement |
public String getOptionalField(String field) throws XElementException {
if ( !containsField(field) )
return null;
return getField(field);
}
|
public XElement getParent() {
return parent;
}
Get the parent of this object, or the object the contains this one. |
public String getText() {
return contents.elementAt( 0 ).toString().trim();
}
Gets the TRIMMED character data that was within this object. This differs
from getValue() in that:
- this fuction will work on attribute and non attribute XElements
- it will trim both ends of the character data before returning it.
|
public String getValue() throws XElementException {
if ( !isField() ) {
throw new XElementException( "" + getName() + " is not an attribute object" );
}
return contents.elementAt( 0 ).toString();
}
Gets the character data that was within this object. This fuction can
only be used on objects that are attributes. |
public boolean isField() {
return contents.size() == 1;
}
Returns true if the object is an attribute object. An object is an
attribute object if it does not contain any other objects. |
public void removeFromParent() throws XElementException {
if ( parent == null ) {
throw new XElementException( "" + getName() + " does not have a parent" );
}
parent.contents.remove( this );
parent = null;
}
Removes this XElement from the parent. |
public void setAttribute(String key,
String value) {
metadata.put( key, value );
}
Sets/Adds a metatag value Only metatags whose value is not empty will
display when the toString() methods is called. |
public void setField(String key,
String value) throws XElementException {
getElement( key ).setValue( value );
}
|
public void setName(String newName) {
name = newName;
}
|
public void setOptionalField(String field,
String value) throws XElementException {
if ( value == null ) {
if( containsField(field) )
getElement(field).removeFromParent();
return;
}
if( containsField(field) )
setField(field, value);
else
addField(field, value);
}
|
public void setValue(String value) throws XElementException {
if ( !isField() ) {
throw new XElementException( "" + getName() + " is not an attribute object" );
}
contents.setElementAt( new StringBuffer( value ), 0 );
}
Gets the character data that was within this object. This fuction can
only be used on objects that are attributes. |
public String toString() {
return toString( 0, true );
}
Serializes this object into a string. |
public String toString(int nestingLevel,
boolean indent) {
try {
StringBuffer indentation = new StringBuffer();
StringBuffer rc = new StringBuffer();
if ( indent ) {
for ( int i = 0; i < nestingLevel; i++ ) {
indentation.append( '\t" );
}
}
rc.append( indentation.toString() );
rc.append( "< " );
rc.append( getName() );
Enumeration enumeration = metadata.keys();
while ( enumeration.hasMoreElements() ) {
String key = ( String )enumeration.nextElement();
String value = ( String )metadata.get( key );
rc.append( ' " );
rc.append( key );
rc.append( "=\"" );
rc.append( metaValueEncode( value ) );
rc.append( '"" );
}
if ( isField() ) {
if ( getValue().length() == 0 ) {
rc.append( "/ >" );
rc.append( nl );
} else {
rc.append( ' >" );
rc.append( valueEncode( getValue() ) );
rc.append( "< /" );
rc.append( getName() );
rc.append( ' >" );
rc.append( nl );
}
} else {
rc.append( ' >" );
rc.append( nl );
String text = getText();
if ( text.length() > 0 ) {
rc.append( indentation.toString() + "\t" );
rc.append( getText() );
rc.append( nl );
}
for ( int i = 1; i < contents.size(); i++ ) {
Object o = contents.elementAt( i );
rc.append( ( ( XElement )o ).toString( nestingLevel + 1, indent ) );
}
rc.append( indentation.toString() );
rc.append( "< /" );
rc.append( getName() );
rc.append( ' >" );
rc.append( nl );
}
return rc.toString();
} catch ( XElementException e ) {
// This should not occur!
e.printStackTrace();
System.exit( 1 );
return "";
}
}
Serializes this object into a string. |
public String toXML(boolean indent) {
return
"< ?xml version=\"1.0\" encoding=\"UTF-8\"? >" + nl +
toString( 0, indent );
}
Serializes this object into a XML document String. |