web-dev-qa-db-fra.com

Ajouter de nouveaux attributs à un nœud XML existant en java?

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)**
11
user2966458

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);
20
subash

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");
6
Sergey Tarasov

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>
3
stripybadger

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).

0
Yeti