package org.newdawn.slick.util.xml; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NodeList; import org.w3c.dom.Text; /** * A utility wrapper round the standard DOM XML element. This provides a more simple API * for accessing attributes, children and providing defaults when schemas arn't used - which * is generally a little simpler for most of us. * * @author kevin */ public class XMLElement { /** The Java DOM implementation XML element */ private Element dom; /** The list of children initialised on first access */ private XMLElementList children; /** The name of the element */ private String name; /** * Create a new element wrapped round a DOM element * * @param xmlElement The DOM element to present */ XMLElement(Element xmlElement) { dom = xmlElement; name = dom.getTagName(); } /** * Get the names of the attributes specified on this element * * @return The names of the elements specified */ public String[] getAttributeNames() { NamedNodeMap map = dom.getAttributes(); String[] names = new String[map.getLength()]; for (int i=0;i<names.length;i++) { names[i] = map.item(i).getNodeName(); } return names; } /** * Get the name of this element * * @return The name of this element */ public String getName() { return name; } /** * Get the value specified for a given attribute on this element * * @param name The name of the attribute whose value should be retrieved * @return The value given for the attribute */ public String getAttribute(String name) { return dom.getAttribute(name); } /** * Get the value specified for a given attribute on this element * * @param name The name of the attribute whose value should be retrieved * @param def The default value to return if the attribute is specified * @return The value given for the attribute */ public String getAttribute(String name, String def) { String value = dom.getAttribute(name); if ((value == null) || (value.length() == 0)) { return def; } return value; } /** * Get the value specified for a given attribute on this element as an integer. * * @param name The name of the attribute whose value should be retrieved * @return The value given for the attribute * @throws SlickXMLException Indicates a failure to convert the value into an integer */ public int getIntAttribute(String name) throws SlickXMLException { try { return Integer.parseInt(getAttribute(name)); } catch (NumberFormatException e) { throw new SlickXMLException("Value read: '"+getAttribute(name)+"' is not an integer",e); } } /** * Get the value specified for a given attribute on this element as an integer. * * @param name The name of the attribute whose value should be retrieved * @param def The default value to return if the attribute is specified * @return The value given for the attribute * @throws SlickXMLException Indicates a failure to convert the value into an integer */ public int getIntAttribute(String name, int def) throws SlickXMLException { try { return Integer.parseInt(getAttribute(name,""+def)); } catch (NumberFormatException e) { throw new SlickXMLException("Value read: '"+getAttribute(name, ""+def)+"' is not an integer",e); } } /** * Get the value specified for a given attribute on this element as an double. * * @param name The name of the attribute whose value should be retrieved * @return The value given for the attribute * @throws SlickXMLException Indicates a failure to convert the value into an double */ public double getDoubleAttribute(String name) throws SlickXMLException { try { return Double.parseDouble(getAttribute(name)); } catch (NumberFormatException e) { throw new SlickXMLException("Value read: '"+getAttribute(name)+"' is not a double",e); } } /** * Get the value specified for a given attribute on this element as an double. * * @param name The name of the attribute whose value should be retrieved * @param def The default value to return if the attribute is specified * @return The value given for the attribute * @throws SlickXMLException Indicates a failure to convert the value into an double */ public double getDoubleAttribute(String name, double def) throws SlickXMLException { try { return Double.parseDouble(getAttribute(name,""+def)); } catch (NumberFormatException e) { throw new SlickXMLException("Value read: '"+getAttribute(name, ""+def)+"' is not a double",e); } } /** * Get the value specified for a given attribute on this element as a boolean. * * @param name The name of the attribute whose value should be retrieved * @return The value given for the attribute * @throws SlickXMLException Indicates a failure to convert the value into an boolean */ public boolean getBooleanAttribute(String name) throws SlickXMLException { String value = getAttribute(name); if (value.equalsIgnoreCase("true")) { return true; } if (value.equalsIgnoreCase("false")) { return false; } throw new SlickXMLException("Value read: '"+getAttribute(name)+"' is not a boolean"); } /** * Get the value specified for a given attribute on this element as a boolean. * * @param name The name of the attribute whose value should be retrieved * @param def The default value to return if the attribute is specified * @return The value given for the attribute * @throws SlickXMLException Indicates a failure to convert the value into an boolean */ public boolean getBooleanAttribute(String name, boolean def) throws SlickXMLException { String value = getAttribute(name,""+def); if (value.equalsIgnoreCase("true")) { return true; } if (value.equalsIgnoreCase("false")) { return false; } throw new SlickXMLException("Value read: '"+getAttribute(name, ""+def)+"' is not a boolean"); } /** * Get the text content of the element, i.e. the bit between the tags * * @return The text content of the node */ public String getContent() { String content = ""; NodeList list = dom.getChildNodes(); for (int i=0;i<list.getLength();i++) { if (list.item(i) instanceof Text) { content += (list.item(i).getNodeValue()); } } return content; } /** * Get the complete list of children for this node * * @return The list of children for this node */ public XMLElementList getChildren() { if (children != null) { return children; } NodeList list = dom.getChildNodes(); children = new XMLElementList(); for (int i=0;i<list.getLength();i++) { if (list.item(i) instanceof Element) { children.add(new XMLElement((Element) list.item(i))); } } return children; } /** * Get a list of children with a given element name * * @param name The name of the element type that should be retrieved * @return A list of elements */ public XMLElementList getChildrenByName(String name) { XMLElementList selected = new XMLElementList(); XMLElementList children = getChildren(); for (int i=0;i<children.size();i++) { if (children.get(i).getName().equals(name)) { selected.add(children.get(i)); } } return selected; } /** * @see java.lang.Object#toString() */ public String toString() { String value = "[XML "+getName(); String[] attrs = getAttributeNames(); for (int i=0;i<attrs.length;i++) { value += " "+attrs[i]+"="+getAttribute(attrs[i]); } value += "]"; return value; } }