web-dev-qa-db-ja.com

新しい属性をJavaの既存のXMLノードに追加しますか?

既存の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)**
12
user2966458

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

最も簡単で最短の方法は、ノードを org.w3c.dom.Element にキャストしてから、そのノードで setAttribute を呼び出すことです。

((Element)aNode).setAttribute("name", "value");
7
Sergey Tarasov

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
stripybadger

推奨されるアプローチ:

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アプローチを使用してください。

1
Yeti