Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 17600] ファイルの概要

このコミットは、Go言語の標準ライブラリ encoding/xml パッケージにおけるXML名前空間の扱いに関する挙動の文書化を目的としています。具体的には、DecoderStrict モードが有効でない場合に、未定義の名前空間プレフィックスを持つタグがどのように処理されるかを明確にしています。

コミット

encoding/xml パッケージの Decoder 構造体において、Strict フィールドのドキュメントが更新され、Strict モードが無効な場合のXML名前空間の処理に関する挙動が追記されました。これにより、未定義の名前空間プレフィックスを持つタグがどのように扱われるかが明確化されています。

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/1385e394cf919e53a02ed4ecaef331a603128329

元コミット内容

commit 1385e394cf919e53a02ed4ecaef331a603128329
Author: Russ Cox <rsc@golang.org>
Date:   Sun Sep 15 11:29:06 2013 -0400

    encoding/xml: document behavior for undefined name space prefixes
    
    Fixes #5626.
    
    R=golang-dev, dominik.honnef
    CC=golang-dev
    https://golang.org/cl/13702043
---
 src/pkg/encoding/xml/xml.go | 4 ++++\n 1 file changed, 4 insertions(+)

diff --git a/src/pkg/encoding/xml/xml.go b/src/pkg/encoding/xml/xml.go
index 467c2ae14f..5b9d670024 100644
--- a/src/pkg/encoding/xml/xml.go
+++ b/src/pkg/encoding/xml/xml.go
@@ -150,6 +150,10 @@ type Decoder struct {
  	//	d.Entity = HTMLEntity
  	//
  	// creates a parser that can handle typical HTML.
+\t//
+\t// Strict mode does not enforce the requirements of the XML name spaces TR.\n+\t// In particular it does not reject name space tags using undefined prefixes.\n+\t// Such tags are recorded with the unknown prefix as the name space URL.\n \tStrict bool
 \n  	// When Strict == false, AutoClose indicates a set of elements to

変更の背景

このコミットは、Goの encoding/xml パッケージがXML名前空間をどのように扱うかについて、既存の挙動をより明確に文書化するために行われました。特に、DecoderStrict フィールドが false に設定されている(つまり、非厳格モードである)場合に、XML名前空間の仕様(XML Namespaces TR)に厳密に従わない挙動、具体的には未定義の名前空間プレフィックスを持つタグの処理について、ユーザーが混乱しないように説明を追加することが目的です。

この変更は、Go issue #5626 に対応するものです。このイシューでは、encoding/xml デコーダが未定義の名前空間プレフィックスを持つXML要素をエラーとせずにパースしてしまう挙動が報告されていました。XML名前空間の仕様では、使用されるすべての名前空間プレフィックスは事前に定義されている必要があります。しかし、encoding/xml パッケージは、HTMLのようなより寛容な形式を扱うために、デフォルトで厳格なXML名前空間の検証を行いません。この挙動自体は意図されたものでしたが、その挙動がドキュメントに明記されていなかったため、ユーザーが混乱する可能性がありました。

このコミットは、コードの挙動を変更するのではなく、その挙動を正確に反映するようにドキュメントを更新することで、ユーザーの理解を深め、誤解を防ぐことを目的としています。

前提知識の解説

XML (Extensible Markup Language)

XMLは、情報を構造化するためのマークアップ言語です。HTMLがウェブページの表示に特化しているのに対し、XMLはデータの記述と交換に重点を置いています。XML文書はツリー構造を持ち、要素、属性、テキストコンテンツなどで構成されます。

XML名前空間 (XML Namespaces)

XML名前空間は、XML文書内で要素名や属性名の衝突を避けるためのメカニズムです。異なるXML語彙(スキーマ)から要素や属性を組み合わせる際に特に重要になります。名前空間はURI(Uniform Resource Identifier)によって識別され、通常はプレフィックスとコロン (:) を使って要素名や属性名に関連付けられます。

例:

<root xmlns:book="http://example.com/books">
  <book:title>Go Programming</book:title>
</root>

この例では、book というプレフィックスが http://example.com/books というURIにマッピングされ、book:title 要素がその名前空間に属することを示しています。

名前空間プレフィックスの定義

XML名前空間の仕様では、要素や属性で使用されるすべての名前空間プレフィックスは、xmlns:prefix="URI" の形式で定義されている必要があります。未定義のプレフィックスが使用された場合、それはXML名前空間の仕様に違反します。

Go encoding/xml パッケージ

Goの encoding/xml パッケージは、XML文書のエンコード(Goの構造体からXMLへ)とデコード(XMLからGoの構造体へ)を提供します。このパッケージは、XMLパーサーとマーシャラー/アンマーシャラーの機能を提供し、GoプログラムでXMLデータを簡単に扱えるようにします。

xml.DecoderStrict モード

xml.Decoder はXMLストリームを読み込み、Goのデータ構造にデコードするための型です。Decoder 構造体には Strict というブール型のフィールドがあります。

  • Strict = true: 厳格モード。XMLの仕様に厳密に従ってパースを行います。仕様に違反するXML(例えば、未定義の名前空間プレフィックスを持つタグ)はエラーとして扱われることが期待されます。
  • Strict = false (デフォルト): 非厳格モード。より寛容なパースを行います。これは、HTMLのような、XMLの厳密なルールに従わない文書を扱う際に有用です。このモードでは、一部のXML仕様違反がエラーとして扱われないことがあります。

このコミットの文脈では、Strict = false の場合の「未定義の名前空間プレフィックスを持つタグ」の挙動が焦点となっています。

技術的詳細

このコミットは、src/pkg/encoding/xml/xml.go ファイル内の Decoder 構造体の Strict フィールドに対するコメントの追加です。

追加されたコメントは以下の通りです。

// Strict mode does not enforce the requirements of the XML name spaces TR.
// In particular it does not reject name space tags using undefined prefixes.
// Such tags are recorded with the unknown prefix as the name space URL.

このコメントは、Strict フィールドが false の場合の挙動を具体的に説明しています。

  1. Strict mode does not enforce the requirements of the XML name spaces TR.: Strict モード(Stricttrue の場合ではなく、この文脈では Strictfalse の非厳格モードを指していると解釈できます。コメントの配置から、Strict フィールド自体の説明の一部として、Strictfalse の場合の挙動を補足していると考えるのが自然です。)では、XML名前空間の勧告(TR: Technical Recommendation)の要件を強制しないことを明記しています。これは、XML名前空間の仕様に厳密に従わない文書も処理できることを意味します。

  2. In particular it does not reject name space tags using undefined prefixes.: 特に、未定義の名前空間プレフィックスを使用している名前空間タグを拒否しないことを強調しています。これは、XML名前空間の仕様ではエラーとなるべきケースが、encoding/xml の非厳格モードではエラーとならないことを明確にしています。

  3. Such tags are recorded with the unknown prefix as the name space URL.: 未定義のプレフィックスを持つタグがどのように扱われるかについて、具体的な実装の詳細を述べています。これらのタグは、その未定義のプレフィックスが「不明な名前空間URL」として記録されることを示しています。これは、パースされたXML要素の Name.Space フィールドに、その未定義のプレフィックスがそのまま格納されることを意味します。

この変更は、コードのロジック自体には影響を与えませんが、ライブラリのユーザーが encoding/xml パッケージの挙動、特にエラー処理と名前空間の解決に関して、より正確な期待を持てるようにするための重要なドキュメント改善です。

コアとなるコードの変更箇所

変更は src/pkg/encoding/xml/xml.go ファイルの Decoder 構造体内の Strict フィールドのコメント部分です。

--- a/src/pkg/encoding/xml/xml.go
+++ b/src/pkg/encoding/xml/xml.go
@@ -150,6 +150,10 @@ type Decoder struct {
  	//	d.Entity = HTMLEntity
  	//
  	// creates a parser that can handle typical HTML.
+\t//
+\t// Strict mode does not enforce the requirements of the XML name spaces TR.
+\t// In particular it does not reject name space tags using undefined prefixes.
+\t// Such tags are recorded with the unknown prefix as the name space URL.
 \tStrict bool
 \n  	// When Strict == false, AutoClose indicates a set of elements to

具体的には、Strict bool の定義の直前に4行のコメントが追加されています。

コアとなるコードの解説

追加されたコメントは、DecoderStrict フィールドが false の場合の挙動を補足するものです。

Strict フィールドは、XMLのパースを厳格に行うかどうかを制御します。デフォルトでは false であり、これはHTMLのような、より緩やかな形式の文書も処理できるようにするためです。

追加されたコメントは、この非厳格モードがXML名前空間の仕様に厳密に従わない点を明確にしています。

  • Strict mode does not enforce the requirements of the XML name spaces TR.: これは、Strictfalse の場合、XML名前空間の仕様で求められる厳密な検証(例えば、すべてのプレフィックスが定義されていること)が行われないことを意味します。

  • In particular it does not reject name space tags using undefined prefixes.: 最も重要な点として、未定義の名前空間プレフィックスを持つタグ(例: <undefined:tag>) がエラーとして拒否されないことを明示しています。XML名前空間の仕様では、これは通常エラーと見なされます。

  • Such tags are recorded with the unknown prefix as the name space URL.: 未定義のプレフィックスを持つタグがパースされた場合、そのプレフィックスは名前空間URLとして扱われ、xml.Name 構造体の Space フィールドに格納されます。これは、xml.Name{Space: "undefined", Local: "tag"} のようになることを示唆しています。これにより、アプリケーションは未定義の名前空間プレフィックスを持つ要素も処理できるようになりますが、その名前空間が実際に解決されたURIではないことに注意が必要です。

このドキュメントの追加により、開発者は encoding/xml パッケージがXML名前空間をどのように扱うかについて、より正確な理解を持つことができ、特に非厳格モードでの予期せぬ挙動を避けることができます。

関連リンク

参考にした情報源リンク