javax.xml.namespace パッケージでは、XML の名前空間に関連するインターフェース、クラスが定義されています(javax.xml.namespace パッケージのインターフェース、クラス関連の記事一覧)。 Java SE 6 では
- インターフェース NamespaceContext
- クラス QName
の2つの型だけが定義されています。 今回は javax.xml.namespace.QName を見ていきます。
javax.xml.namespace.QName クラス
QName とは、もとは「qualified name」の略で、名前空間 URI が付加された名前のことです。 XML では、要素名や属性名に使用されます。
javax.xml.namespace.QName には
の3つの(Java Beans としての)プロパティが定義されています。
コンストラクタ
javax.xml.namespace.QName には3つのコンストラクタが定義されています。 そのうちの1つは上記3つのプロパティを指定したものです:
QName(String namespaceURI, String localPart, String prefix)
他の2つは名前空間 URI や接頭辞にデフォルト値が用いて、上記のコンストラクタを呼び出します(XMLConstants は javax.xml パッケージ内のクラス):
QName(String namespaceURI, String localPart){ this(namespaceURI, localPart, XMLConstants.DEFAULT_NS_PREFIX); //this(namespaceURI, localPart, ""); } QName(String localPart){ this(XMLConstants.NULL_NS_URI, localPart, XMLConstants.DEFAULT_NS_PREFIX); //this("", localPart, ""); }
また、static メソッド QName#valueOf(String) を用いてもインスタンスを取得することができます:
QName qname1 = QName.valueOf("grammar"); // new QName("grammar") と同じ QName qname2 = QName.valueOf("{http://relaxng.org/ns/structure/1.0}grammar"); // new QName("http://relaxng.org/ns/structure/1.0", "grammar") と同じ
QName#valueOf(String) を用いて取得した QName オブジェクトに対して toString() メソッドを呼び出した際、必ず valueOf() メソッドの引数に指定した文字列が返されます。
アクセッサ・メソッド
上記のように、javax.xml.namespace.QName のプロパティは3つあり、それらに対してアクセッサ・メソッドが定義されています。 ただし、定義されているのは getter メソッドのみで、setter メソッドは定義されていません(immutable)。
QName qname = new QName("http://relaxng.org/ns/structure/1.0", "grammar", "rng"); System.out.println(qname.getNamespaceURI()); // 「http://relaxng.org/ns/structure/1.0」が表示される System.out.println(qname.getLocalPart()); // 「grammar」が表示される System.out.println(qname.getPrefix()); // 「rng」が表示される
equals() メソッド
equals() メソッドを用いてオブジェクトの同値性を判定する際には、XML の仕様にしたがって、名前空間 URI とローカル名のみが考慮され、接頭辞は無視されます。
QName qname1 = new QName("someURI", "name", "prefix1"); QName qname2 = new QName("someURI", "name", "prefix2"); System.out.println(qname1.equals(qname2)); // 「true」が表示される QName qname3 = new QName("anotherURI", "name", "prefix1"); System.out.println(qname1.equals(qname3)); // 「false」が表示される
toString() メソッド
toString() メソッドで返される文字列は、
{Namespace URI}local part
の形をしており、ここでも接頭辞は考慮されません。
QName qname = new QName("http://relaxng.org/ns/structure/1.0", "grammar", "rng"); System.out.println(qname.toString()); // 「{http://relaxng.org/ns/structure/1.0}grammar」が表示される