将新属性添加到java中的现有XML节点?

时间:2013-11-18 16:33:53

标签: java xml nodes

我想在现有的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)**

4 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:6)

最简单和最简短的方法是将节点转换为org.w3c.dom.Element,然后在其上调用setAttribute

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

答案 2 :(得分:3)

你可以使用xslt在几行中完成。 Oracle有一个很好的教程,包含所有代码片段http://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html

xslt的关键位如下所示:

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

答案 3 :(得分:1)

推荐方法:

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方法。