[インデックス 17600] ファイルの概要
このコミットは、Go言語の標準ライブラリ encoding/xml
パッケージにおけるXML名前空間の扱いに関する挙動の文書化を目的としています。具体的には、Decoder
の Strict
モードが有効でない場合に、未定義の名前空間プレフィックスを持つタグがどのように処理されるかを明確にしています。
コミット
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名前空間をどのように扱うかについて、既存の挙動をより明確に文書化するために行われました。特に、Decoder
の Strict
フィールドが 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.Decoder
と Strict
モード
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
の場合の挙動を具体的に説明しています。
-
Strict mode does not enforce the requirements of the XML name spaces TR.
:Strict
モード(Strict
がtrue
の場合ではなく、この文脈ではStrict
がfalse
の非厳格モードを指していると解釈できます。コメントの配置から、Strict
フィールド自体の説明の一部として、Strict
がfalse
の場合の挙動を補足していると考えるのが自然です。)では、XML名前空間の勧告(TR: Technical Recommendation)の要件を強制しないことを明記しています。これは、XML名前空間の仕様に厳密に従わない文書も処理できることを意味します。 -
In particular it does not reject name space tags using undefined prefixes.
: 特に、未定義の名前空間プレフィックスを使用している名前空間タグを拒否しないことを強調しています。これは、XML名前空間の仕様ではエラーとなるべきケースが、encoding/xml
の非厳格モードではエラーとならないことを明確にしています。 -
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行のコメントが追加されています。
コアとなるコードの解説
追加されたコメントは、Decoder
の Strict
フィールドが false
の場合の挙動を補足するものです。
Strict
フィールドは、XMLのパースを厳格に行うかどうかを制御します。デフォルトでは false
であり、これはHTMLのような、より緩やかな形式の文書も処理できるようにするためです。
追加されたコメントは、この非厳格モードがXML名前空間の仕様に厳密に従わない点を明確にしています。
-
Strict mode does not enforce the requirements of the XML name spaces TR.
: これは、Strict
がfalse
の場合、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名前空間をどのように扱うかについて、より正確な理解を持つことができ、特に非厳格モードでの予期せぬ挙動を避けることができます。
関連リンク
- Go issue #5626: https://github.com/golang/go/issues/5626
- Go CL 13702043: https://golang.org/cl/13702043
- Go
encoding/xml
パッケージドキュメント: https://pkg.go.dev/encoding/xml
参考にした情報源リンク
- XML Namespaces (W3C Recommendation): https://www.w3.org/TR/xml-names/
- Go
encoding/xml
ソースコード (Goリポジトリ): https://github.com/golang/go/tree/master/src/encoding/xml - Go issue #5626 の議論 (GitHub): https://github.com/golang/go/issues/5626
- Go CL 13702043 の詳細 (Gerrit): https://go-review.googlesource.com/c/go/+/13702043
- Go
encoding/xml
のStrict
モードに関する議論 (Stack Overflow など、一般的なGoコミュニティの議論) - XML名前空間に関する一般的な解説記事 (MDN Web Docsなど)