Java: Getting the Document from a Node or Element

When we for instance wishes to add a new element we need to pass along the document. If we have a element or a node we can get the document that way. Simply call getOwnerDocument and we are good.

Element element = //code to get a element
Node node = //code to get a node
 
//document from Node
Document document = node.getOwnerDocument();
 
//document from a Element
Document document = element.getOwnerDocument();

Java: Adding a Element under an Element (or Converting a Element to a Node)

When using Document a Element can only be appended with a Node, but what if we have a Element ?

Easy, Element extends Node so just pass the Element along and all is well

import org.w3c.dom.Document;
import org.w3c.dom.Element;
 
Document doc;
Element newElement;
Element oldElement; //code to find that
newElement = doc.createElement("tag");
oldElement.appendChild(newElement);

Java: Creating a enum and converting from a string to the Enum

Here is a simple example of how create a Enum and how to convert from a String to the Enum (the common reason for doing this would be is we at some point have for OurEnum.toString() and now wishes to get back to the OurEnum)

First we need to create the Enum, and this needs to be in its own file

public enum OurEnum { ENUM_A, ENUM_B, ENUM_C }

When we then later on (for instace have saved the toString value in a xml file) wish to

String ourEnumAsAString = "ENUM_A"; //replace with code to read the value
OurEnum ourEnum = OurEnum.valueOf(ourEnumAsAString);

Java safe conversion of float to int

In most cases this is really not needed, if possible please keep the float as a float and work with it as such, but if needed the following works

public static Integer floatToInteger(float value){
    if (Math.round(value) < Integer.MIN_VALUE || Math.round(value) > Integer.MAX_VALUE) {
        throw new IllegalArgumentException
            (value + " cannot be cast to int without changing its value.");
    }
    return (int) Math.round(value);
}

(It might be needed for instance for a switch/case as that don’t work with float – or to work with external/legacy API’s that we can not or wish not to modify)

Specifying the JVM to run Eclipse with

Specifying the JVM Eclipse should use is both a nice way to make sure it is correct now and to know that future upgrades/updates won’t mess with this.

This is done by specifying the -vm option in the “eclipse.ini” file.

Important bits to know about this:

  • -vm option and the path must not be on the same line
  • You should give the Java excecutable here, not just the path where is is located
  • if you also have -vmargs the -vm must be before that in the ini file

Example eclipse.ini (for windows)

-startup
plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.100.v20110502
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vm
C:\progra~1\Java\jdk1.6.0_26\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m

Java org.w3c.dom.Document add attribute to Node(s) (Element(s))

This example will add((or update if exists) a attribute to one or several Element(s).

NodeList nodeList = document.getElementsByTagName("tagToFind");
for (int i = 0; i < nodeList.getLength(); i++){
	( (Element)nodeList.item(i) ).setAttribute("attributeNameToAdd", "attributeStringValueToAdd");
}

And what the manual (jdk6u30) says about setAttribute:

setAttribute

void setAttribute(String name,
String value)
throws DOMException

Adds a new attribute. If an attribute with that name is already present in the element, its value is changed to be that of the value parameter. This value is a simple string; it is not parsed as it is being set. So any markup (such as syntax to be recognized as an entity reference) is treated as literal text, and needs to be appropriately escaped by the implementation when it is written out. In order to assign an attribute value that contains entity references, the user must create an Attr node plus any Text and EntityReference nodes, build the appropriate subtree, and use setAttributeNode to assign it as the value of an attribute.
To set an attribute with a qualified name and namespace URI, use the setAttributeNS method.

Parameters:
name – The name of the attribute to create or alter.
value – Value to set in string form.
Throws:
DOMException – INVALID_CHARACTER_ERR: Raised if the specified name is not an XML name according to the XML version in use specified in the Document.xmlVersion attribute.
NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.

Java org.w3c.dom.Document getting an attribule as a string from a Node (Element)

This example shows how to get a list of attribute values from all elements with a given name.
Might not fit your needs but it should give a good idea on how to do things that are similar to this (like simply get a attribute from a singe Element).

public static List<String> getAttributesByElementName(String attribute, String element, String xmlString){
	ArrayList<Integer> listToReturn = new ArrayList<Integer>();
 
	Document document = XmlUtils.loadXMLAsDom(xmlString);
	NodeList nodeList = document.getElementsByTagName(element);
	for (int i = 0; i < nodeList.getLength(); i++){
		String currAttribute = ( (Element)nodeList.item(i) ).getAttribute(attribute);
		if ( !currAttribute.isEmpty() ){
			listToReturn.add(currAttribute );
		}
	}
	return listToReturn;
}

Java org.w3c.dom.Document output nicely formatted

This will print a nicely formatted (indented, linebreaks etc) i.e. more human readable xml document.

public static String getNiceLyFormattedXMLDocument(Document doc) throws IOException, TransformerException {
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
    transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
 
    Writer stringWriter = new StringWriter();
    StreamResult streamResult = new StreamResult(stringWriter);
    transformer.transform(new DOMSource(doc), streamResult);
    String result = stringWriter.toString();
 
    return result;
}