倭マン's BLOG

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

XMLStreamWriter#writeXxxx() メソッド (3) : 名前空間を使用する場合の要素・属性

今回は名前空間を使用する場合の要素と属性を書き出す XMLStreamWriter#writeXxxx() メソッドを見ていきましょう。

定義されているメソッドは、要素の開始、空要素、属性の書き出しメソッドです:

void writeStartElement(String uri, String localName);
void writeStartElement(String prefix, String localName, String uri);

void writeEmptyElement(String uri, String localName);
void writeEmptyElement(String prefix, String localName, String uri);

void writeAttribute(String uri, String localName, String value);
void writeAttribute(String prefix, String uri, String localName, String value);

これらメソッドは XMLStreamWriter のプロパティ(設定は XMLOutputFactory で行う)「javax.xml.stream.isRepairingNamespace」の値 (true / false) によって挙動が異なります。 これは名前空間宣言を適切に埋め込む(自動的に)かどうかを指定します。 ちなみに、このプロパティのデフォルト値は「false」。

以下に書かれているサンプルでは

  • writer」は XMLStreamWriter のインスタンス
  • 接頭辞「rng」は名前空間"http://relaxng.org/ns/structure/1.0"」に関連づけられている(登録されている)
  • 接頭辞「xlink」は名前空間"http://www.w3.org/1999/xlink"」に関連づけられている
  • サンプルのコメント内で「★」が付いているものはプロパティ「javax.xml.stream.isRepairingNamespace」の値によって挙動が異なるメソッド

とします。

「isRepairingNamespaces == false」の場合


要素:writeStartElement(), writeEmptyElement()

writeStartElement() のサンプル見ていきましょう。 writeEmptyElement() はほぼ同じなので省略。

名前空間 URI が登録されている場合:

writer.writeStartElement("http://relaxng.org/ns/structure/1.0", "grammar");
// 「<rng:grammar>」と出力される。

writer.writeStartElement("rng", "grammar", "http://relaxng.org/ns/structure/1.0");
// 「<rng:grammar>」と出力される。

writer.writeStartElement("relaxng", "grammar", "http://relaxng.org/ns/structure/1.0");
// ★XMLStreamException が投げられる。

名前空間 URI が登録されていない場合:

writer.writeStartElement("http://www.w3.org/2001/XMLSchema", "schema");
// ★XMLStreamException が投げられる。

writer.writeStartElement("xsd", "schema", "http://www.w3.org/2001/XMLSchema");
// ★「<xsd:schema>」と出力される。

属性:writeAttribute()

名前空間 URI が登録されている場合:

writer.writeAttribute("http://www.w3.org/1999/xlink", "href", "some value");
// 「xlink:href="some value"」と出力される。

writer.writeAttribute("xlink", "href", "http://www.w3.org/1999/xlink", "some value");
// 「xlink:href="some value"」と出力される。

writer.writeAttribute("l", "href", "http://www.w3.org/1999/xlink", "some value");
// ★XMLStreamException が投げられる。

名前空間 URI が登録されていない場合:

writer.writeAttribute(
    "http://relaxng.org/ns/compatibility/annotations/0.9", "defaultValue", "some value");
// ★XMLStreamException が投げられる。

writer.writeAttribute(
    "a", "defaultValue", "http://relaxng.org/ns/compatibility/annotations/0.9", "some value");
// 「xmlns:a="http://relaxng.org/ns/compatibility/annotations/0.9" a:defaultValue="some value"」
// と出力される。

「isRepairingNamespaces == true」の場合


要素:writeStartElement(), writeEmptyElement()

writeStartElement() メソッドのサンプルを見ていきましょう。

名前空間 URI が登録されている場合:

writer.writeStartElement("http://relaxng.org/ns/structure/1.0", "grammar");
// 「<rng:grammar>」と出力される。

writer.writeStartElement("rng", "grammar", "http://relaxng.org/ns/structure/1.0");
// 「<rng:grammar>」と出力される。

writer.writeStartElement("relaxng", "grammar", "http://relaxng.org/ns/structure/1.0");
// ★「<relaxng:grammar xmlns:relaxng="http://relaxng.org/ns/structure/1.0">」と表示される。

3番目のメソッドでは、もし接頭辞 "relaxng" が他の名前空間に関連づけられていれば、別の接頭辞が生成されます:

public void test()throws Exception{
    XMLOutputFactory factory = XMLOutputFactory.newInstance();
    factory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true);
    XMLStreamWriter writer = factory.createXMLStreamWriter(System.out);
        
    writer.setPrefix("p", "ns-uri");
    writer.writeStartElement("p", "root", "another ns-uri");
    writer.writeStartElement("ns-uri", "child");
    writer.writeEndDocument();
        
    writer.flush();
    }

これを実行すると

と表示されます(生成される接頭辞は実行環境などによって異なるかもしれません)。

名前空間 URI が登録されていない場合:

writer.writeStartElement("http://www.w3.org/2001/XMLSchema", "schema");
// ★「<*:schema xmlns:*="http://www.w3.org/2001/XMLSchema">」と出力される。
// 「*」は自動的に生成される文字列。

writer.writeStartElement("xsd", "schema", "http://www.w3.org/2001/XMLSchema");
// ★「<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">」と出力される。

属性:writeAttribute()

名前空間 URI が登録されている場合:

writer.writeAttribute("http://www.w3.org/1999/xlink", "href", "some value");
// 「xlink:href="some value"」と出力される。

writer.writeAttribute("xlink", "href", "http://www.w3.org/1999/xlink", "some value");
// 「xlink:href="some value"」と出力される。

writer.writeAttribute("l", "href", "http://www.w3.org/1999/xlink", "some value");
// ★「xmlns:l="http://www.w3.org/1999/xlink" l:href="some value"」と出力される。

3番目のメソッドは、要素の場合と同様に指定された接頭辞 ("l") が他の名前空間に関連づけられている場合、適当な文字列が自動的に生成されます。

名前空間 URI が登録されていない場合:

writer.writeAttribute(
    "http://relaxng.org/ns/compatibility/annotations/0.9", "defaultValue", "some value");
// ★「xmlns:*="http://relaxng.org/ns/compatibility/annotations/0.9" *:href="some value"」
// と出力される。
// 「*」は自動的に生成される文字列。

writer.writeAttribute(
    "a", "defaultValue", "http://relaxng.org/ns/compatibility/annotations/0.9", "some value");
// 「xmlns:a="http://relaxng.org/ns/compatibility/annotations/0.9" a:defaultValue="some value"」
// と出力される。