github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/encoding/xml/xml.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 implements a simple XML 1.0 parser that 6 // understands XML name spaces. 7 package xml 8 9 import ( 10 "github.com/shogo82148/std/bytes" 11 "github.com/shogo82148/std/io" 12 ) 13 14 // SyntaxErrorは、XML入力ストリームの構文エラーを表します。 15 type SyntaxError struct { 16 Msg string 17 Line int 18 } 19 20 func (e *SyntaxError) Error() string 21 22 // Nameは、名前空間識別子(Space)で注釈付けされたXML名(Local)を表します。 23 // [Decoder.Token] によって返されるトークンでは、Space識別子は 24 // パースされるドキュメントで使用される短いプレフィックスではなく、 25 // 正規のURLとして与えられます。 26 type Name struct { 27 Space, Local string 28 } 29 30 // Attrは、XML要素内の属性(Name=Value)を表します。 31 type Attr struct { 32 Name Name 33 Value string 34 } 35 36 // Tokenは、次のトークンタイプのいずれかを保持するインターフェースです: 37 // [StartElement]、[EndElement]、[CharData]、[Comment]、[ProcInst]、または [Directive]。 38 type Token any 39 40 // StartElementは、XMLの開始要素を表します。 41 type StartElement struct { 42 Name Name 43 Attr []Attr 44 } 45 46 // Copyは、StartElementの新しいコピーを作成します。 47 func (e StartElement) Copy() StartElement 48 49 // Endは、対応するXML終了要素を返します。 50 func (e StartElement) End() EndElement 51 52 // EndElementは、XMLの終了要素を表します。 53 type EndElement struct { 54 Name Name 55 } 56 57 // CharDataは、XMLエスケープシーケンスがそれらが表す文字に置き換えられた 58 // XML文字データ(生テキスト)を表します。 59 type CharData []byte 60 61 // Copyは、CharDataの新しいコピーを作成します。 62 func (c CharData) Copy() CharData 63 64 // Commentは、<!--comment-->の形式のXMLコメントを表します。 65 // バイトには、<!-- および --> のコメントマーカーは含まれません。 66 type Comment []byte 67 68 // Copyは、Commentの新しいコピーを作成します。 69 func (c Comment) Copy() Comment 70 71 // ProcInstは、<?target inst?>の形式のXML処理命令を表します。 72 type ProcInst struct { 73 Target string 74 Inst []byte 75 } 76 77 // Copyは、ProcInstの新しいコピーを作成します。 78 func (p ProcInst) Copy() ProcInst 79 80 // Directiveは、<!text>形式のXML指示を表します。 81 // バイトには、<! および > のマーカーは含まれません。 82 type Directive []byte 83 84 // Copyは、Directiveの新しいコピーを作成します。 85 func (d Directive) Copy() Directive 86 87 // CopyTokenは、Tokenのコピーを返します。 88 func CopyToken(t Token) Token 89 90 // TokenReaderは、XMLトークンのストリームをデコードできるものを指します。 91 // これには、[Decoder] も含まれます。 92 // 93 // Tokenがトークンの読み取りに成功した後にエラーまたはファイル終了の状態に遭遇した場合、 94 // それはそのトークンを返します。それは同じ呼び出しから(非nilの)エラーを返すか、 95 // 次の呼び出しからエラー(とnilトークン)を返すかもしれません。 96 // この一般的なケースの一例は、トークンストリームの終わりで非nilのトークンを返すTokenReaderが、 97 // io.EOFまたはnilエラーのどちらかを返す可能性があるということです。 98 // 次のReadはnil, [io.EOF] を返すべきです。 99 // 100 // Tokenの実装は、nilトークンとnilエラーを返すことを推奨されていません。 101 // 呼び出し元はnil, nilの返り値を何も起こらなかったことを示すものとして扱うべきです。 102 // 特に、これはEOFを示すものではありません。 103 type TokenReader interface { 104 Token() (Token, error) 105 } 106 107 // Decoderは、特定の入力ストリームを読み取るXMLパーサーを表します。 108 // パーサーは、その入力がUTF-8でエンコードされていると仮定します。 109 type Decoder struct { 110 // Strictはデフォルトでtrueで、XML仕様の要件を強制します。 111 // falseに設定すると、パーサーは一般的な間違いを含む入力を許可します: 112 // * 要素が終了タグを欠いている場合、パーサーは必要に応じて 113 // 終了タグを発明して、Tokenからの戻り値を適切にバランスさせます。 114 // * 属性値とキャラクターデータでは、未知または不正な 115 // キャラクターエンティティ(&で始まるシーケンス)はそのままにされます。 116 // 117 // 設定: 118 // 119 // d.Strict = false 120 // d.AutoClose = xml.HTMLAutoClose 121 // d.Entity = xml.HTMLEntity 122 // 123 // これにより、一般的なHTMLを処理できるパーサーが作成されます。 124 // 125 // 厳格モードでは、XML名前空間TRの要件は強制されません。 126 // 特に、未定義のプレフィックスを使用する名前空間タグは拒否されません。 127 // そのようなタグは、未知のプレフィックスを名前空間URLとして記録します。 128 Strict bool 129 130 // Strict == falseの場合、AutoCloseは、開かれた直後に閉じるとみなす要素のセットを示します。 131 // これは、終了要素が存在するかどうかに関係なく適用されます。 132 AutoClose []string 133 134 // Entityは、非標準のエンティティ名を文字列の置換にマッピングするために使用できます。 135 // パーサーは、実際のマップの内容に関係なく、これらの標準マッピングがマップに存在するかのように動作します: 136 // 137 // "lt": "<", 138 // "gt": ">", 139 // "amp": "&", 140 // "apos": "'", 141 // "quot": `"`, 142 Entity map[string]string 143 144 // CharsetReaderがnilでない場合、提供された非UTF-8文字セットからUTF-8に変換する 145 // 文字セット変換リーダーを生成する関数を定義します。CharsetReaderがnilであるか、 146 // エラーを返す場合、パースはエラーで停止します。CharsetReaderの結果値のうちの 147 // 一つは非nilでなければなりません。 148 CharsetReader func(charset string, input io.Reader) (io.Reader, error) 149 150 // DefaultSpaceは、飾り気のないタグに使用されるデフォルトの名前空間を設定します。 151 // まるでXMLストリーム全体が、属性xmlns="DefaultSpace"を含む要素で 152 // ラップされているかのように動作します。 153 DefaultSpace string 154 155 r io.ByteReader 156 t TokenReader 157 buf bytes.Buffer 158 saved *bytes.Buffer 159 stk *stack 160 free *stack 161 needClose bool 162 toClose Name 163 nextToken Token 164 nextByte int 165 ns map[string]string 166 err error 167 line int 168 linestart int64 169 offset int64 170 unmarshalDepth int 171 } 172 173 // NewDecoderは、rから読み取る新しいXMLパーサーを作成します。 174 // もしrが [io.ByteReader] を実装していない場合、NewDecoderは 175 // 自身でバッファリングを行います。 176 func NewDecoder(r io.Reader) *Decoder 177 178 // NewTokenDecoderは、基礎となるトークンストリームを使用して新しいXMLパーサーを作成します。 179 func NewTokenDecoder(t TokenReader) *Decoder 180 181 // Tokenは、入力ストリームの次のXMLトークンを返します。 182 // 入力ストリームの終わりでは、Tokenはnil, [io.EOF] を返します。 183 // 184 // 返されたトークンデータのバイトスライスは、パーサーの内部バッファを参照し、 185 // 次のTokenへの呼び出しまでのみ有効です。バイトのコピーを取得するには、 186 // [CopyToken] を呼び出すか、トークンのCopyメソッドを呼び出します。 187 // 188 // Tokenは、<br>のような自己閉鎖要素を展開し、 189 // 連続した呼び出しで返される別々の開始要素と終了要素にします。 190 // 191 // Tokenは、返される [StartElement] と [EndElement] トークンが適切にネストされ、 192 // マッチしていることを保証します:もしTokenが予期しない終了要素や、 193 // すべての予期される終了要素の前にEOFに遭遇した場合、エラーを返します。 194 // 195 // [Decoder.CharsetReader] が呼び出され、エラーを返す場合、 196 // そのエラーはラップされて返されます。 197 // 198 // Tokenは、https://www.w3.org/TR/REC-xml-names/ で説明されているような 199 // XML名前空間を実装します。Tokenに含まれる各 [Name] 構造体は、その名前空間を 200 // 識別するURLがわかっている場合にSpaceに設定されます。 201 // もしTokenが認識できない名前空間プレフィックスに遭遇した場合、 202 // エラーを報告する代わりにプレフィックスをSpaceとして使用します。 203 func (d *Decoder) Token() (Token, error) 204 205 // RawTokenはTokenと同様ですが、開始要素と終了要素が一致することを検証せず、 206 // 名前空間のプレフィックスを対応するURLに変換しません。 207 func (d *Decoder) RawToken() (Token, error) 208 209 // InputOffsetは、現在のデコーダ位置の入力ストリームバイトオフセットを返します。 210 // オフセットは、最近返されたトークンの終わりと次のトークンの始まりの位置を示します。 211 func (d *Decoder) InputOffset() int64 212 213 // InputPosは、現在のデコーダ位置の行と、行の1ベースの入力位置を返します。 214 // 位置は、最近返されたトークンの終わりの位置を示します。 215 func (d *Decoder) InputPos() (line, column int) 216 217 // HTMLEntityは、標準的なHTMLエンティティ文字の変換を含むエンティティマップです。 218 // 219 // [Decoder.Strict] と [Decoder.Entity] フィールドのドキュメンテーションを参照してください。 220 var HTMLEntity map[string]string = htmlEntity 221 222 // HTMLAutoCloseは、自動的に閉じるとみなすべきHTML要素のセットです。 223 // 224 // [Decoder.Strict] と [Decoder.Entity] フィールドのドキュメンテーションを参照してください。 225 var HTMLAutoClose []string = htmlAutoClose 226 227 // EscapeTextは、プレーンテキストデータsの適切にエスケープされたXML相当物をwに書き込みます。 228 func EscapeText(w io.Writer, s []byte) error 229 230 // Escapeは [EscapeText] と同様ですが、エラーの戻り値を省略します。 231 // これはGo 1.0との後方互換性のために提供されています。 232 // Go 1.1以降を対象とするコードは [EscapeText] を使用するべきです。 233 func Escape(w io.Writer, s []byte)