倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

名前空間の暗黙的取り扱い (2) -- 名前を文字列で指定して子ノードを付加するメソッド

今回は org.dom4j.Element に定義されている、要素に対して新たにノードを付け加えるメソッドを2つ見ていきます(一覧):

  • addElement(String) : Element*1
  • addAttribute(String, String) : Element

付け加えるノードが要素か属性かによって、設定される名前空間が異なります。 ただし、祖先要素でも名前空間(宣言)を使っていなければ、どちらも NULL 名前空間 ("") になります。

Element#addElement(String) : Element


addElement() メソッドを用いて要素を付加すると、付加した要素の名前空間デフォルト名前空間、すなわち親(祖先)要素で定義された接頭辞なしの名前空間*2に設定されます。

サンプルを見てみましょう。

// 準備
Document doc = DocumentHelper.parseText("<parent xmlns='ns'/>");
Element root = doc.getRootElement();
        
// 要素を付け加える
root.addElement("child");

これを実行すると、Document オブジェクト doc が表す XML 文書は

<parent xmlns="ns">
  <child/>
</parent>

となります。 <child> 要素の名前空間は「"ns" 名前空間」になっています。

Element#addAttribute(String, String) : Element


addAttribute() メソッドを用いて属性を付加すると、付加した要素の名前空間NULL 名前空間に設定されます。

サンプルを見てみましょう:

// 準備
Document doc = DocumentHelper.parseText("<parent xmlns='ns'/>");
Element root = doc.getRootElement();

// 属性を付け加える
root.addAttribute("att", "value");

これを実行すると、Document オブジェクト doc が表す XML 文書は

<parent xmlns="ns" att="value"/>

となります。 @att 属性の名前空間はNULL 名前空間に設定されています。

*1:実際には addElement() メソッドは org.dom4j.Branch に定義されています。

*2:対応する名前空間宣言がない場合は NULL 名前空間になります。