19

I want to add an attribute to an existing xml node.I don't want to add new elements (new nodes) to my xml file, I just want to add a new attribute. How can I do this?

In particular I've tried this lines of code:

Element process = doc.getElementsById("id");
    process.setAttribute("modelgroup", "");

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new  File("C:\\Users\\Blerta\\workspaceKEPLER\\XML_to_JSON\\SampleExample.xml"));
transformer.transform(source, result);

But I get the following exception:

Exception in thread "main" java.lang.NullPointerException
    at Main.appendAttributes(Main.java:172)
    at Main.displayNodes(Main.java:65)
    at Main.displayNodes(Main.java:138)
    at Main.main(Main.java:42)**
1
  • paste the line where nullpointer occures Commented Nov 18, 2013 at 16:50

4 Answers 4

31

in DOM parser it is very easy. get your node and simply use this function.

((Element)node).setAttribute("attr_name","attr_value");

then finally update your document. like this..

        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5");
        DOMSource source = new DOMSource(document);
        StreamResult result = new StreamResult(new File(tablePath));
        transformer.transform(source, result);
Sign up to request clarification or add additional context in comments.

3 Comments

I've allready tried this but I cannot apply setAttribute to the node
doc.getElementsByTagName("process"); it is return NodeList. try like this. NodeList list = doc.getElementsByTagName("process");. Element el = (Element)list.item(0); then you can use el.setAttribute("attr_name","attr_val");
What if node isn't castable to Element?
8

The easiest and the shortest is to cast the node to org.w3c.dom.Element and then invoke setAttribute on it:

((Element)aNode).setAttribute("name", "value");

5 Comments

What if node isn't castable to Element?
Yes, what if aNode does not extend Element class?
@Stephan, it doesn't make sense to add an attribute to something that isn't an Element.
@DawoodibnKareem An exception will be raised if aNode isn't castable to Element.
Well, yes, obviously. That's exactly what SHOULD happen, because adding an attribute to something that's not an Element makes no sense.
3

You could do it in a few lines using xslt. Oracle have a half decent tutorial with all the code snippets http://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html

The key bit for your xslt would be something like the following:

    <xsl:template match="elementToAddNewAttrTo">
        <xsl:attribute name="newAttrName">NewAttrValue</xsl:attribute>
    </xsl:template>

Comments

1

Recommended approach:

Node node = ...;
if(node.getNodeType() == Node.ELEMENT_NODE)
{
    ((Element) node).setAttribute("name", "value");
}

Situational approach:

try
{
    // ...
    Node node = ...;
    ((Element) node).setAttribute("name", "value");
    // ...
}
catch(ClassCastException e)
{
    // Handle exception
}

Only use the try-catch approach if you already know that all the nodes that you process should be of type 'Element' (and thus any other case is an "exception" and should break from the code).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.