倭マン's BLOG

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

QName

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」が表示される