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)