github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/encoding/xml/read.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package xml 6 7 // Unmarshalは、XMLエンコードされたデータを解析し、結果を 8 // vが指す値に格納します。vは任意の構造体、スライス、または文字列でなければなりません。 9 // vに収まらない形式の良いデータは破棄されます。 10 // 11 // Unmarshalはreflectパッケージを使用するため、エクスポートされた(大文字の)フィールドにのみ割り当てることができます。 12 // Unmarshalは、XML要素名をタグ値と構造体フィールド名にマッチさせるために、大文字と小文字を区別する比較を使用します。 13 // 14 // Unmarshalは、以下のルールを使用してXML要素を構造体にマップします。 15 // ルールでは、フィールドのタグは、構造体フィールドのタグに関連付けられた 16 // 'xml'キーの値を指します(上記の例を参照してください)。 17 // 18 // - 構造体がタグが",innerxml"の[]byte型またはstring型のフィールドを持つ場合、 19 // Unmarshalはそのフィールドに要素内にネストされた生のXMLを蓄積します。 20 // 他のルールは依然として適用されます。 21 // 22 // - 構造体がName型のフィールドXMLNameを持つ場合、 23 // Unmarshalはそのフィールドに要素名を記録します。 24 // 25 // - XMLNameフィールドが"名前"または"名前空間-URL 名前"の形式の関連タグを持つ場合、 26 // XML要素は指定された名前(およびオプションで名前空間)を持たなければならず、 27 // そうでない場合、Unmarshalはエラーを返します。 28 // 29 // - XML要素が、",attr"を含む関連タグを持つ構造体フィールド名と一致する名前の属性、 30 // または"名前,attr"の形式の構造体フィールドタグの明示的な名前を持つ場合、 31 // Unmarshalはそのフィールドに属性値を記録します。 32 // 33 // - XML要素が前のルールで処理されない属性を持ち、 34 // 構造体が",any,attr"を含む関連タグを持つフィールドを持つ場合、 35 // Unmarshalは最初のそのようなフィールドに属性値を記録します。 36 // 37 // - XML要素が文字データを含む場合、そのデータは 38 // タグが",chardata"の最初の構造体フィールドに蓄積されます。 39 // 構造体フィールドは[]byte型またはstring型を持つことができます。 40 // そのようなフィールドがない場合、文字データは破棄されます。 41 // 42 // - XML要素がコメントを含む場合、それらは 43 // タグが",comment"の最初の構造体フィールドに蓄積されます。 44 // 構造体フィールドは[]byte型またはstring型を持つことができます。 45 // そのようなフィールドがない場合、コメントは破棄されます。 46 // 47 // - XML要素が、タグが"a"または"a>b>c"の形式のプレフィックスと一致する名前のサブ要素を含む場合、 48 // Unmarshalは指定された名前を持つ要素を探してXML構造に降りていき、 49 // 最も内側の要素をその構造体フィールドにマップします。 50 // ">"で始まるタグは、フィールド名に続く">"で始まるタグと同等です。 51 // 52 // - XML要素が、名前が構造体フィールドのXMLNameタグと一致し、 53 // 前のルールに従って明示的な名前タグを持たないサブ要素を含む場合、 54 // Unmarshalはそのサブ要素をその構造体フィールドにマップします。 55 // 56 // - XML要素が、モードフラグ(",attr", ",chardata"など)を持たないフィールド名と一致する 57 // サブ要素を含む場合、Unmarshalはそのサブ要素をその構造体フィールドにマップします。 58 // 59 // - XML要素が、上記のルールのいずれにも一致しないサブ要素を含み、 60 // 構造体がタグ",any"のフィールドを持つ場合、Unmarshalはそのサブ要素をその構造体フィールドにマップします。 61 // 62 // - 匿名の構造体フィールドは、その値のフィールドが外部の構造体の一部であるかのように処理されます。 63 // 64 // - タグ"-"を持つ構造体フィールドは、決してアンマーシャルされません。 65 // 66 // UnmarshalがUnmarshalerインターフェースを実装するフィールドタイプに遭遇した場合、 67 // UnmarshalはそのUnmarshalXMLメソッドを呼び出してXML要素から値を生成します。 68 // それ以外の場合、値が [encoding.TextUnmarshaler] を実装している場合、 69 // Unmarshalはその値のUnmarshalTextメソッドを呼び出します。 70 // 71 // Unmarshalは、XML要素をstringまたは[]byteにマップします。これは、 72 // その要素の文字データの連結をstringまたは[]byteに保存することで行います。 73 // 保存された[]byteは決してnilになりません。 74 // 75 // Unmarshalは、属性値をstringまたは[]byteにマップします。これは、 76 // 値をstringまたはスライスに保存することで行います。 77 // 78 // Unmarshalは、属性値を [Attr] にマップします。これは、 79 // 名前を含む属性をAttrに保存することで行います。 80 // 81 // Unmarshalは、スライスの長さを拡張し、要素または属性を新しく作成された値にマッピングすることで、 82 // XML要素または属性値をスライスにマッピングします。 83 // 84 // Unmarshalは、XML要素または属性値をboolにマッピングします。 85 // これは、文字列で表されるブール値に設定することで行います。空白はトリムされ、無視されます。 86 // 87 // Unmarshalは、フィールドを文字列値を10進数で解釈した結果に設定することで、 88 // XML要素または属性値を整数または浮動小数点フィールドにマッピングします。 89 // オーバーフローのチェックはありません。空白はトリムされ、無視されます。 90 // 91 // Unmarshalは、要素名を記録することで、XML要素をNameにマッピングします。 92 // 93 // Unmarshalは、ポインタを新しく割り当てられた値に設定し、その値に要素をマッピングすることで、 94 // XML要素をポインタにマッピングします。 95 // 96 // 要素が欠落しているか、属性値が空の場合、ゼロ値としてアンマーシャルされます。 97 // フィールドがスライスの場合、ゼロ値がフィールドに追加されます。それ以外の場合、 98 // フィールドはそのゼロ値に設定されます。 99 func Unmarshal(data []byte, v any) error 100 101 // Decodeは [Unmarshal] と同様に動作しますが、開始要素を見つけるためにデコーダストリームを読みます。 102 func (d *Decoder) Decode(v any) error 103 104 // DecodeElementは [Unmarshal] と同様に動作しますが、 105 // vにデコードする開始XML要素へのポインタを取ります。 106 // クライアントが自身でいくつかの生のXMLトークンを読み込むが、 107 // 一部の要素については [Unmarshal] に委ねたい場合に便利です。 108 func (d *Decoder) DecodeElement(v any, start *StartElement) error 109 110 // UnmarshalErrorは、アンマーシャル処理中のエラーを表します。 111 type UnmarshalError string 112 113 func (e UnmarshalError) Error() string 114 115 // Unmarshalerは、自分自身のXML要素の説明をアンマーシャルできるオブジェクトが実装するインターフェースです。 116 // 117 // UnmarshalXMLは、与えられた開始要素で始まる単一のXML要素をデコードします。 118 // エラーを返す場合、外部のUnmarshalへの呼び出しは停止し、 119 // そのエラーを返します。 120 // UnmarshalXMLは正確に一つのXML要素を消費しなければなりません。 121 // 一般的な実装戦略の一つは、期待されるXMLに一致するレイアウトを持つ 122 // 別の値にアンマーシャルし、そのデータをレシーバにコピーすることです。 123 // もう一つの一般的な戦略は、d.Tokenを使用してXMLオブジェクトを 124 // 一つずつトークンで処理することです。 125 // UnmarshalXMLはd.RawTokenを使用してはなりません。 126 type Unmarshaler interface { 127 UnmarshalXML(d *Decoder, start StartElement) error 128 } 129 130 // UnmarshalerAttrは、自分自身のXML属性の説明をアンマーシャルできるオブジェクトが実装するインターフェースです。 131 // 132 // UnmarshalXMLAttrは単一のXML属性をデコードします。 133 // エラーを返す場合、外部の [Unmarshal] への呼び出しは停止し、 134 // そのエラーを返します。 135 // UnmarshalXMLAttrは、フィールドタグに"attr"オプションを持つ構造体フィールドのみで使用されます。 136 type UnmarshalerAttr interface { 137 UnmarshalXMLAttr(attr Attr) error 138 } 139 140 // Skipは、最も最近消費された開始要素に一致する終了要素を消費するまでトークンを読み込みます。 141 // ネストされた構造はスキップされます。 142 // 開始要素に一致する終了要素を見つけた場合、nilを返します。 143 // それ以外の場合は、問題を説明するエラーを返します。 144 func (d *Decoder) Skip() error