Je souhaite ajouter un attribut à un nœud XML existant. Je ne souhaite pas ajouter de nouveaux éléments (nouveaux nœuds) à mon fichier XML, je souhaite simplement ajouter un nouvel attribut. Comment puis-je faire ceci?
J'ai notamment essayé ces lignes de 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);
Mais j'obtiens l'exception suivante:
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)**
dans l'analyseur DOM, c'est très facile. récupérez votre nœud et utilisez simplement cette fonction.
((Element)node).setAttribute("attr_name","attr_value");
puis enfin mettre à jour votre document. comme ça..
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);
Le plus simple et le plus court consiste à convertir le nœud en org.w3c.dom.Element puis à invoquer setAttribute :
((Element)aNode).setAttribute("name", "value");
Vous pouvez le faire en quelques lignes en utilisant xslt. Oracle propose un tutoriel décent avec tous les extraits de code http://docs.Oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html
Le bit clé pour votre xslt serait quelque chose comme ce qui suit:
<xsl:template match="elementToAddNewAttrTo">
<xsl:attribute name="newAttrName">NewAttrValue</xsl:attribute>
</xsl:template>
Approche recommandée:
Node node = ...;
if(node.getNodeType() == Node.ELEMENT_NODE)
{
((Element) node).setAttribute("name", "value");
}
Approche situationnelle:
try
{
// ...
Node node = ...;
((Element) node).setAttribute("name", "value");
// ...
}
catch(ClassCastException e)
{
// Handle exception
}
N'utilisez l'approche try-catch que si vous savez déjà que tous les nœuds que vous traitez doivent être de type 'Élément' (ainsi tout autre cas est une "exception" et doit être séparé du code).