既存の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);
最も簡単で最短の方法は、ノードを org.w3c.dom.Element にキャストしてから、そのノードで setAttribute を呼び出すことです。
((Element)aNode).setAttribute("name", "value");
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>
推奨されるアプローチ:
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アプローチを使用してください。