在java中向现有XML节点添加新属性?

在java中向现有XML节点添加新属性?,java,xml,nodes,Java,Xml,Nodes,我想向现有xml节点添加属性。我不想向xml文件添加新元素(新节点),我只想添加一个新属性。我该怎么做 我特别尝试了以下几行代码: Element process = doc.getElementsById("id"); process.setAttribute("modelgroup", ""); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transfor

我想向现有xml节点添加属性。我不想向xml文件添加新元素(新节点),我只想添加一个新属性。我该怎么做

我特别尝试了以下几行代码:

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);
但我有以下例外:

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

在DOM解析器中,这非常简单。获取节点并简单地使用此函数

((Element)node).setAttribute("attr_name","attr_value");
然后最后更新您的文档。像这样

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

您可以使用xslt在几行中完成这项工作。Oracle提供了一个包含所有代码片段的相当不错的教程

xslt的关键部分如下所示:

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

新属性值

最简单和最短的方法是将节点强制转换到,然后在其上调用:

建议的做法:

Node node = ...;
if(node.getNodeType() == Node.ELEMENT_NODE)
{
    ((Element) node).setAttribute("name", "value");
}
try
{
    // ...
    Node node = ...;
    ((Element) node).setAttribute("name", "value");
    // ...
}
catch(ClassCastException e)
{
    // Handle exception
}
情景方法:

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

只有在您已经知道您处理的所有节点都应该是“Element”类型(因此任何其他情况都是“例外”并且应该与代码分离)的情况下,才可以使用try-catch方法。

我已经尝试过这个方法,但我无法将setAttribute应用于nodedoc.getElementsByTagName(“进程”);它是返回节点列表。像这样试试。NodeList list=doc.getElementsByTagName(“进程”);。元素el=(元素)列表。项(0);然后可以使用el.setAttribute(“attr_name”、“attr_val”);如果节点不可强制转换为元素怎么办?粘贴出现空指针的行如果节点不可强制转换为元素怎么办?是的,如果阳极不扩展元素类怎么办?@Stephan,将属性添加到非元素的东西是没有意义的。@DawoodibnKareem如果
阳极
不能强制转换到元素,则会引发异常。当然,是的,很明显。这正是应该发生的事情,因为将属性添加到非元素的东西是没有意义的。