xml

package
v1.21.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 24, 2023 License: MIT Imports: 3 Imported by: 0

Documentation

Overview

Package xml implements a simple XML 1.0 parser that understands XML name spaces.

Example (CustomMarshalXML)
package main

import (
	"github.com/shogo82148/std/encoding/xml"
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/log"
)

const (
	Unknown Animal = iota
	Gopher
	Zebra
)

func main() {
	blob := `
	<animals>
		<animal>gopher</animal>
		<animal>armadillo</animal>
		<animal>zebra</animal>
		<animal>unknown</animal>
		<animal>gopher</animal>
		<animal>bee</animal>
		<animal>gopher</animal>
		<animal>zebra</animal>
	</animals>`
	var zoo struct {
		Animals []Animal `xml:"animal"`
	}
	if err := xml.Unmarshal([]byte(blob), &zoo); err != nil {
		log.Fatal(err)
	}

	census := make(map[Animal]int)
	for _, animal := range zoo.Animals {
		census[animal] += 1
	}

	fmt.Printf("Zoo Census:\n* Gophers: %d\n* Zebras:  %d\n* Unknown: %d\n",
		census[Gopher], census[Zebra], census[Unknown])

}
Output:

Zoo Census:
* Gophers: 3
* Zebras:  2
* Unknown: 3
Example (TextMarshalXML)
package main

import (
	"github.com/shogo82148/std/encoding/xml"
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/log"
)

const (
	Unrecognized Size = iota
	Small
	Large
)

func main() {
	blob := `
	<sizes>
		<size>small</size>
		<size>regular</size>
		<size>large</size>
		<size>unrecognized</size>
		<size>small</size>
		<size>normal</size>
		<size>small</size>
		<size>large</size>
	</sizes>`
	var inventory struct {
		Sizes []Size `xml:"size"`
	}
	if err := xml.Unmarshal([]byte(blob), &inventory); err != nil {
		log.Fatal(err)
	}

	counts := make(map[Size]int)
	for _, size := range inventory.Sizes {
		counts[size] += 1
	}

	fmt.Printf("Inventory Counts:\n* Small:        %d\n* Large:        %d\n* Unrecognized: %d\n",
		counts[Small], counts[Large], counts[Unrecognized])

}
Output:

Inventory Counts:
* Small:        3
* Large:        2
* Unrecognized: 3

Index

Examples

Constants

View Source
const (
	// Headerは、Marshalの出力と一緒に使用するのに適した一般的なXMLヘッダーです。
	// これはこのパッケージの出力に自動的に追加されるものではなく、便宜上提供されています。
	Header = `<?xml version="1.0" encoding="UTF-8"?>` + "\n"
)

Variables

View Source
var HTMLAutoClose []string = htmlAutoClose

HTMLAutoCloseは、自動的に閉じるとみなすべきHTML要素のセットです。

Decoder.StrictとDecoder.Entityフィールドのドキュメンテーションを参照してください。

View Source
var HTMLEntity map[string]string = htmlEntity

HTMLEntityは、標準的なHTMLエンティティ文字の変換を含むエンティティマップです。

Decoder.StrictとDecoder.Entityフィールドのドキュメンテーションを参照してください。

Functions

func Escape

func Escape(w io.Writer, s []byte)

EscapeはEscapeTextと同様ですが、エラーの戻り値を省略します。 これはGo 1.0との後方互換性のために提供されています。 Go 1.1以降を対象とするコードはEscapeTextを使用するべきです。

func EscapeText added in v1.1.0

func EscapeText(w io.Writer, s []byte) error

EscapeTextは、プレーンテキストデータsの適切にエスケープされたXML相当物をwに書き込みます。

func Marshal

func Marshal(v any) ([]byte, error)

Marshalは、vのXMLエンコーディングを返します。

Marshalは、配列またはスライスを処理するために、各要素をマーシャリングします。 Marshalは、ポインタが指す値をマーシャリングするか、ポインタがnilの場合は何も書き込まないことで、ポインタを処理します。 Marshalは、インターフェース値が含む値をマーシャリングするか、インターフェース値がnilの場合は何も書き込まないことで、インターフェース値を処理します。 Marshalは、その他のすべてのデータを処理するために、データを含む1つ以上のXML要素を書き込みます。

XML要素の名前は、以下の優先順位で取得されます:

  • データが構造体の場合、XMLNameフィールドのタグ
  • Name型のXMLNameフィールドの値
  • データを取得するために使用された構造体フィールドのタグ
  • データを取得するために使用された構造体フィールドの名前
  • マーシャルされた型の名前

構造体のXML要素には、構造体のエクスポートされた各フィールドのマーシャルされた要素が含まれますが、以下の例外があります:

  • 上記で説明したXMLNameフィールドは省略されます。
  • タグ "-" のフィールドは省略されます。
  • タグ "name,attr" のフィールドは、XML要素内で指定された名前の属性になります。
  • タグ ",attr" のフィールドは、XML要素内でフィールド名の属性になります。
  • タグ ",chardata" のフィールドは、文字データとして書き込まれ、XML要素としては書き込まれません。
  • タグ ",cdata" のフィールドは、<![CDATA[ ... ]]>タグで囲まれた文字データとして書き込まれ、XML要素としては書き込まれません。
  • タグ ",innerxml" のフィールドは、通常のマーシャリング手順に従わず、そのまま書き込まれます。
  • タグ ",comment" のフィールドは、通常のマーシャリング手順に従わず、XMLコメントとして書き込まれます。これには "--" 文字列を含めることはできません。
  • "omitempty" オプションを含むタグのフィールドは、フィールド値が空の場合に省略されます。空の値は false、0、nil ポインタまたはインターフェース値、長さゼロの配列、スライス、マップ、文字列です。
  • 匿名の構造体フィールドは、その値のフィールドが外部の構造体の一部であるかのように処理されます。
  • Marshalerを実装するフィールドは、そのMarshalXMLメソッドを呼び出して書き込まれます。
  • encoding.TextMarshalerを実装するフィールドは、そのMarshalTextメソッドの結果をテキストとしてエンコードして書き込まれます。

フィールドがタグ "a>b>c" を使用する場合、要素cは親要素aとbの内部にネストされます。 同じ親を名指す隣接するフィールドは、1つのXML要素内に囲まれます。

構造体フィールドのXML名がフィールドタグと構造体のXMLNameフィールドの両方によって定義されている場合、 名前は一致しなければなりません。

例については、MarshalIndentを参照してください。

Marshalは、チャネル、関数、またはマップをマーシャルするように求められた場合、エラーを返します。

func MarshalIndent

func MarshalIndent(v any, prefix, indent string) ([]byte, error)

MarshalIndentはMarshalと同様に動作しますが、各XML要素は新しい インデントされた行から始まり、その行はprefixで始まり、ネストの深さに応じて indentの一つ以上のコピーに続きます。

Example
package main

import (
	"github.com/shogo82148/std/encoding/xml"
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/os"
)

func main() {
	type Address struct {
		City, State string
	}
	type Person struct {
		XMLName   xml.Name `xml:"person"`
		Id        int      `xml:"id,attr"`
		FirstName string   `xml:"name>first"`
		LastName  string   `xml:"name>last"`
		Age       int      `xml:"age"`
		Height    float32  `xml:"height,omitempty"`
		Married   bool
		Address
		Comment string `xml:",comment"`
	}

	v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42}
	v.Comment = " Need more details. "
	v.Address = Address{"Hanga Roa", "Easter Island"}

	output, err := xml.MarshalIndent(v, "  ", "    ")
	if err != nil {
		fmt.Printf("error: %v\n", err)
	}

	os.Stdout.Write(output)
}
Output:

  <person id="13">
      <name>
          <first>John</first>
          <last>Doe</last>
      </name>
      <age>42</age>
      <Married>false</Married>
      <City>Hanga Roa</City>
      <State>Easter Island</State>
      <!-- Need more details. -->
  </person>

func Unmarshal

func Unmarshal(data []byte, v any) error

Unmarshalは、XMLエンコードされたデータを解析し、結果を vが指す値に格納します。vは任意の構造体、スライス、または文字列でなければなりません。 vに収まらない形式の良いデータは破棄されます。

Unmarshalはreflectパッケージを使用するため、エクスポートされた(大文字の)フィールドにのみ割り当てることができます。 Unmarshalは、XML要素名をタグ値と構造体フィールド名にマッチさせるために、大文字と小文字を区別する比較を使用します。

Unmarshalは、以下のルールを使用してXML要素を構造体にマップします。 ルールでは、フィールドのタグは、構造体フィールドのタグに関連付けられた 'xml'キーの値を指します(上記の例を参照してください)。

  • 構造体がタグが",innerxml"の[]byte型またはstring型のフィールドを持つ場合、 Unmarshalはそのフィールドに要素内にネストされた生のXMLを蓄積します。 他のルールは依然として適用されます。

  • 構造体がName型のフィールドXMLNameを持つ場合、 Unmarshalはそのフィールドに要素名を記録します。

  • XMLNameフィールドが"名前"または"名前空間-URL 名前"の形式の関連タグを持つ場合、 XML要素は指定された名前(およびオプションで名前空間)を持たなければならず、 そうでない場合、Unmarshalはエラーを返します。

  • XML要素が、",attr"を含む関連タグを持つ構造体フィールド名と一致する名前の属性、 または"名前,attr"の形式の構造体フィールドタグの明示的な名前を持つ場合、 Unmarshalはそのフィールドに属性値を記録します。

  • XML要素が前のルールで処理されない属性を持ち、 構造体が",any,attr"を含む関連タグを持つフィールドを持つ場合、 Unmarshalは最初のそのようなフィールドに属性値を記録します。

  • XML要素が文字データを含む場合、そのデータは タグが",chardata"の最初の構造体フィールドに蓄積されます。 構造体フィールドは[]byte型またはstring型を持つことができます。 そのようなフィールドがない場合、文字データは破棄されます。

  • XML要素がコメントを含む場合、それらは タグが",comment"の最初の構造体フィールドに蓄積されます。 構造体フィールドは[]byte型またはstring型を持つことができます。 そのようなフィールドがない場合、コメントは破棄されます。

  • XML要素が、タグが"a"または"a>b>c"の形式のプレフィックスと一致する名前のサブ要素を含む場合、 Unmarshalは指定された名前を持つ要素を探してXML構造に降りていき、 最も内側の要素をその構造体フィールドにマップします。 ">"で始まるタグは、フィールド名に続く">"で始まるタグと同等です。

  • XML要素が、名前が構造体フィールドのXMLNameタグと一致し、 前のルールに従って明示的な名前タグを持たないサブ要素を含む場合、 Unmarshalはそのサブ要素をその構造体フィールドにマップします。

  • XML要素が、モードフラグ(",attr", ",chardata"など)を持たないフィールド名と一致する サブ要素を含む場合、Unmarshalはそのサブ要素をその構造体フィールドにマップします。

  • XML要素が、上記のルールのいずれにも一致しないサブ要素を含み、 構造体がタグ",any"のフィールドを持つ場合、Unmarshalはそのサブ要素をその構造体フィールドにマップします。

  • 匿名の構造体フィールドは、その値のフィールドが外部の構造体の一部であるかのように処理されます。

  • タグ"-"を持つ構造体フィールドは、決してアンマーシャルされません。

UnmarshalがUnmarshalerインターフェースを実装するフィールドタイプに遭遇した場合、 UnmarshalはそのUnmarshalXMLメソッドを呼び出してXML要素から値を生成します。 それ以外の場合、値がencoding.TextUnmarshalerを実装している場合、 Unmarshalはその値のUnmarshalTextメソッドを呼び出します。

Unmarshalは、XML要素をstringまたは[]byteにマップします。これは、 その要素の文字データの連結をstringまたは[]byteに保存することで行います。 保存された[]byteは決してnilになりません。

Unmarshalは、属性値をstringまたは[]byteにマップします。これは、 値をstringまたはスライスに保存することで行います。

Unmarshalは、属性値をAttrにマップします。これは、 名前を含む属性をAttrに保存することで行います。

Unmarshalは、スライスの長さを拡張し、要素または属性を新しく作成された値にマッピングすることで、 XML要素または属性値をスライスにマッピングします。

Unmarshalは、XML要素または属性値をboolにマッピングします。 これは、文字列で表されるブール値に設定することで行います。空白はトリムされ、無視されます。

Unmarshalは、フィールドを文字列値を10進数で解釈した結果に設定することで、 XML要素または属性値を整数または浮動小数点フィールドにマッピングします。 オーバーフローのチェックはありません。空白はトリムされ、無視されます。

Unmarshalは、要素名を記録することで、XML要素をNameにマッピングします。

Unmarshalは、ポインタを新しく割り当てられた値に設定し、その値に要素をマッピングすることで、 XML要素をポインタにマッピングします。

要素が欠落しているか、属性値が空の場合、ゼロ値としてアンマーシャルされます。 フィールドがスライスの場合、ゼロ値がフィールドに追加されます。それ以外の場合、 フィールドはそのゼロ値に設定されます。

Example

この例では、XMLの一部をあらかじめ設定されたフィールドを持つ値にアンマーシャルする方法を示しています。 Phoneフィールドが変更されず、XMLの<Company>要素が無視されることに注意してください。 また、Groupsフィールドは、そのタグに提供された要素パスを考慮して割り当てられます。

package main

import (
	"github.com/shogo82148/std/encoding/xml"
	"github.com/shogo82148/std/fmt"
)

func main() {
	type Email struct {
		Where string `xml:"where,attr"`
		Addr  string
	}
	type Address struct {
		City, State string
	}
	type Result struct {
		XMLName xml.Name `xml:"Person"`
		Name    string   `xml:"FullName"`
		Phone   string
		Email   []Email
		Groups  []string `xml:"Group>Value"`
		Address
	}
	v := Result{Name: "none", Phone: "none"}

	data := `
		<Person>
			<FullName>Grace R. Emlin</FullName>
			<Company>Example Inc.</Company>
			<Email where="home">
				<Addr>gre@example.com</Addr>
			</Email>
			<Email where='work'>
				<Addr>gre@work.com</Addr>
			</Email>
			<Group>
				<Value>Friends</Value>
				<Value>Squash</Value>
			</Group>
			<City>Hanga Roa</City>
			<State>Easter Island</State>
		</Person>
	`
	err := xml.Unmarshal([]byte(data), &v)
	if err != nil {
		fmt.Printf("error: %v", err)
		return
	}
	fmt.Printf("XMLName: %#v\n", v.XMLName)
	fmt.Printf("Name: %q\n", v.Name)
	fmt.Printf("Phone: %q\n", v.Phone)
	fmt.Printf("Email: %v\n", v.Email)
	fmt.Printf("Groups: %v\n", v.Groups)
	fmt.Printf("Address: %v\n", v.Address)
}
Output:

XMLName: xml.Name{Space:"", Local:"Person"}
Name: "Grace R. Emlin"
Phone: "none"
Email: [{home gre@example.com} {work gre@work.com}]
Groups: [Friends Squash]
Address: {Hanga Roa Easter Island}

Types

type Attr

type Attr struct {
	Name  Name
	Value string
}

Attrは、XML要素内の属性(Name=Value)を表します。

type CharData

type CharData []byte

CharDataは、XMLエスケープシーケンスがそれらが表す文字に置き換えられた XML文字データ(生テキスト)を表します。

func (CharData) Copy

func (c CharData) Copy() CharData

Copyは、CharDataの新しいコピーを作成します。

type Comment

type Comment []byte

Commentは、<!--comment-->の形式のXMLコメントを表します。 バイトには、<!-- および --> のコメントマーカーは含まれません。

func (Comment) Copy

func (c Comment) Copy() Comment

Copyは、Commentの新しいコピーを作成します。

type Decoder

type Decoder struct {
	// Strictはデフォルトでtrueで、XML仕様の要件を強制します。
	// falseに設定すると、パーサーは一般的な間違いを含む入力を許可します:
	//	* 要素が終了タグを欠いている場合、パーサーは必要に応じて
	//	  終了タグを発明して、Tokenからの戻り値を適切にバランスさせます。
	//	* 属性値とキャラクターデータでは、未知または不正な
	//	  キャラクターエンティティ(&で始まるシーケンス)はそのままにされます。
	//
	// 設定:
	//
	//	d.Strict = false
	//	d.AutoClose = xml.HTMLAutoClose
	//	d.Entity = xml.HTMLEntity
	//
	// これにより、一般的なHTMLを処理できるパーサーが作成されます。
	//
	// 厳格モードでは、XML名前空間TRの要件は強制されません。
	// 特に、未定義のプレフィックスを使用する名前空間タグは拒否されません。
	// そのようなタグは、未知のプレフィックスを名前空間URLとして記録します。
	Strict bool

	// Strict == falseの場合、AutoCloseは、開かれた直後に閉じるとみなす要素のセットを示します。
	// これは、終了要素が存在するかどうかに関係なく適用されます。
	AutoClose []string

	// Entityは、非標準のエンティティ名を文字列の置換にマッピングするために使用できます。
	// パーサーは、実際のマップの内容に関係なく、これらの標準マッピングがマップに存在するかのように動作します:
	//
	//	"lt": "<",
	//	"gt": ">",
	//	"amp": "&",
	//	"apos": "'",
	//	"quot": `"`,
	Entity map[string]string

	// CharsetReaderがnilでない場合、提供された非UTF-8文字セットからUTF-8に変換する
	// 文字セット変換リーダーを生成する関数を定義します。CharsetReaderがnilであるか、
	// エラーを返す場合、パースはエラーで停止します。CharsetReaderの結果値のうちの
	// 一つは非nilでなければなりません。
	CharsetReader func(charset string, input io.Reader) (io.Reader, error)

	// DefaultSpaceは、飾り気のないタグに使用されるデフォルトの名前空間を設定します。
	// まるでXMLストリーム全体が、属性xmlns="DefaultSpace"を含む要素で
	// ラップされているかのように動作します。
	DefaultSpace string
	// contains filtered or unexported fields
}

Decoderは、特定の入力ストリームを読み取るXMLパーサーを表します。 パーサーは、その入力がUTF-8でエンコードされていると仮定します。

func NewDecoder

func NewDecoder(r io.Reader) *Decoder

NewDecoderは、rから読み取る新しいXMLパーサーを作成します。 もしrがio.ByteReaderを実装していない場合、NewDecoderは 自身でバッファリングを行います。

func NewTokenDecoder added in v1.10.0

func NewTokenDecoder(t TokenReader) *Decoder

NewTokenDecoderは、基礎となるトークンストリームを使用して新しいXMLパーサーを作成します。

func (*Decoder) Decode

func (d *Decoder) Decode(v any) error

DecodeはUnmarshalと同様に動作しますが、開始要素を見つけるためにデコーダストリームを読みます。

func (*Decoder) DecodeElement

func (d *Decoder) DecodeElement(v any, start *StartElement) error

DecodeElementはUnmarshalと同様に動作しますが、 vにデコードする開始XML要素へのポインタを取ります。 クライアントが自身でいくつかの生のXMLトークンを読み込むが、 一部の要素についてはUnmarshalに委ねたい場合に便利です。

func (*Decoder) InputOffset added in v1.4.0

func (d *Decoder) InputOffset() int64

InputOffsetは、現在のデコーダ位置の入力ストリームバイトオフセットを返します。 オフセットは、最近返されたトークンの終わりと次のトークンの始まりの位置を示します。

func (*Decoder) InputPos added in v1.19.0

func (d *Decoder) InputPos() (line, column int)

InputPosは、現在のデコーダ位置の行と、行の1ベースの入力位置を返します。 位置は、最近返されたトークンの終わりの位置を示します。

func (*Decoder) RawToken

func (d *Decoder) RawToken() (Token, error)

RawTokenはTokenと同様ですが、開始要素と終了要素が一致することを検証せず、 名前空間のプレフィックスを対応するURLに変換しません。

func (*Decoder) Skip

func (d *Decoder) Skip() error

Skipは、最も最近消費された開始要素に一致する終了要素を消費するまでトークンを読み込みます。 ネストされた構造はスキップされます。 開始要素に一致する終了要素を見つけた場合、nilを返します。 それ以外の場合は、問題を説明するエラーを返します。

func (*Decoder) Token

func (d *Decoder) Token() (Token, error)

Tokenは、入力ストリームの次のXMLトークンを返します。 入力ストリームの終わりでは、Tokenはnil, io.EOFを返します。

返されたトークンデータのバイトスライスは、パーサーの内部バッファを参照し、 次のTokenへの呼び出しまでのみ有効です。バイトのコピーを取得するには、 CopyTokenを呼び出すか、トークンのCopyメソッドを呼び出します。

Tokenは、<br>のような自己閉鎖要素を展開し、 連続した呼び出しで返される別々の開始要素と終了要素にします。

Tokenは、返されるStartElementとEndElementトークンが適切にネストされ、 マッチしていることを保証します:もしTokenが予期しない終了要素や、 すべての予期される終了要素の前にEOFに遭遇した場合、エラーを返します。

CharsetReaderが呼び出され、エラーを返す場合、 そのエラーはラップされて返されます。

Tokenは、https://www.w3.org/TR/REC-xml-names/ で説明されているような XML名前空間を実装します。Tokenに含まれる各Name構造体は、その名前空間を 識別するURLがわかっている場合にSpaceに設定されます。 もしTokenが認識できない名前空間プレフィックスに遭遇した場合、 エラーを報告する代わりにプレフィックスをSpaceとして使用します。

type Directive

type Directive []byte

Directiveは、<!text>形式のXML指示を表します。 バイトには、<! および > のマーカーは含まれません。

func (Directive) Copy

func (d Directive) Copy() Directive

Copyは、Directiveの新しいコピーを作成します。

type Encoder

type Encoder struct {
	// contains filtered or unexported fields
}

Encoderは、XMLデータを出力ストリームに書き込みます。

Example
package main

import (
	"github.com/shogo82148/std/encoding/xml"
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/os"
)

func main() {
	type Address struct {
		City, State string
	}
	type Person struct {
		XMLName   xml.Name `xml:"person"`
		Id        int      `xml:"id,attr"`
		FirstName string   `xml:"name>first"`
		LastName  string   `xml:"name>last"`
		Age       int      `xml:"age"`
		Height    float32  `xml:"height,omitempty"`
		Married   bool
		Address
		Comment string `xml:",comment"`
	}

	v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42}
	v.Comment = " Need more details. "
	v.Address = Address{"Hanga Roa", "Easter Island"}

	enc := xml.NewEncoder(os.Stdout)
	enc.Indent("  ", "    ")
	if err := enc.Encode(v); err != nil {
		fmt.Printf("error: %v\n", err)
	}

}
Output:

  <person id="13">
      <name>
          <first>John</first>
          <last>Doe</last>
      </name>
      <age>42</age>
      <Married>false</Married>
      <City>Hanga Roa</City>
      <State>Easter Island</State>
      <!-- Need more details. -->
  </person>

func NewEncoder

func NewEncoder(w io.Writer) *Encoder

NewEncoderは、wに書き込む新しいエンコーダを返します。

func (*Encoder) Close added in v1.20.0

func (enc *Encoder) Close() error

エンコーダを閉じます。これは、これ以上データが書き込まれないことを示します。 バッファリングされたXMLを基礎となるライターにフラッシュし、 書き込まれたXMLが無効である場合(例えば、閉じられていない要素を含む場合)にエラーを返します。

func (*Encoder) Encode

func (enc *Encoder) Encode(v any) error

Encodeは、vのXMLエンコーディングをストリームに書き込みます。

Goの値をXMLに変換する詳細については、Marshalのドキュメンテーションを参照してください。

Encodeは、戻る前にFlushを呼び出します。

func (*Encoder) EncodeElement added in v1.2.0

func (enc *Encoder) EncodeElement(v any, start StartElement) error

EncodeElementは、vのXMLエンコーディングをストリームに書き込みます。 この際、エンコーディングの最も外側のタグとしてstartを使用します。

Goの値をXMLに変換する詳細については、Marshalのドキュメンテーションを参照してください。

EncodeElementは、戻る前にFlushを呼び出します。

func (*Encoder) EncodeToken added in v1.2.0

func (enc *Encoder) EncodeToken(t Token) error

EncodeTokenは、与えられたXMLトークンをストリームに書き込みます。 StartElementとEndElementトークンが適切にマッチしていない場合、エラーを返します。

EncodeTokenはFlushを呼び出しません。なぜなら、通常これはEncodeやEncodeElement (またはそれらの間に呼び出されるカスタムMarshalerのMarshalXML)のような大きな操作の一部であり、 それらは終了時にFlushを呼び出します。 Encoderを作成し、EncodeやEncodeElementを使用せずに直接EncodeTokenを呼び出す呼び出し元は、 XMLが基礎となるライターに書き込まれることを確認するために、終了時にFlushを呼び出す必要があります。

EncodeTokenは、"xml"をTargetに設定したProcInstを、ストリームの最初のトークンとしてのみ書き込むことを許可します。

func (*Encoder) Flush added in v1.2.0

func (enc *Encoder) Flush() error

Flushは、バッファリングされたXMLを基礎となるライターにフラッシュします。 いつ必要かについての詳細は、EncodeTokenのドキュメンテーションを参照してください。

func (*Encoder) Indent added in v1.1.0

func (enc *Encoder) Indent(prefix, indent string)

Indentは、エンコーダを設定して、各要素が新しいインデントされた行から始まるXMLを生成します。 その行はprefixで始まり、ネストの深さに応じてindentの一つ以上のコピーに続きます。

type EndElement

type EndElement struct {
	Name Name
}

EndElementは、XMLの終了要素を表します。

type Marshaler added in v1.2.0

type Marshaler interface {
	MarshalXML(e *Encoder, start StartElement) error
}

Marshalerは、自身を有効なXML要素にマーシャルできるオブジェクトが実装するインターフェースです。

MarshalXMLは、レシーバをゼロ個以上のXML要素としてエンコードします。 通常、配列やスライスは、エントリごとに一つの要素としてエンコードされます。 startを要素タグとして使用することは必須ではありませんが、そうすることで UnmarshalがXML要素を正しい構造体フィールドにマッチさせることができます。 一般的な実装戦略の一つは、所望のXMLに対応するレイアウトを持つ別の 値を構築し、それをe.EncodeElementを使用してエンコードすることです。 もう一つの一般的な戦略は、e.EncodeTokenを繰り返し呼び出して、 XML出力を一つずつトークンとして生成することです。 エンコードされたトークンのシーケンスは、ゼロ個以上の有効な XML要素を構成しなければなりません。

type MarshalerAttr added in v1.2.0

type MarshalerAttr interface {
	MarshalXMLAttr(name Name) (Attr, error)
}

MarshalerAttrは、自身を有効なXML属性にマーシャルできるオブジェクトが実装するインターフェースです。

MarshalXMLAttrは、レシーバのエンコードされた値を持つXML属性を返します。 属性名としてnameを使用することは必須ではありませんが、そうすることで Unmarshalが属性を正しい構造体フィールドにマッチさせることができます。 MarshalXMLAttrがゼロ属性Attr{}を返す場合、出力には属性が生成されません。 MarshalXMLAttrは、フィールドタグに"attr"オプションを持つ構造体フィールドのみで使用されます。

type Name

type Name struct {
	Space, Local string
}

Nameは、名前空間識別子(Space)で注釈付けされたXML名(Local)を表します。 Decoder.Tokenによって返されるトークンでは、Space識別子は パースされるドキュメントで使用される短いプレフィックスではなく、 正規のURLとして与えられます。

type ProcInst

type ProcInst struct {
	Target string
	Inst   []byte
}

ProcInstは、<?target inst?>の形式のXML処理命令を表します。

func (ProcInst) Copy

func (p ProcInst) Copy() ProcInst

Copyは、ProcInstの新しいコピーを作成します。

type StartElement

type StartElement struct {
	Name Name
	Attr []Attr
}

StartElementは、XMLの開始要素を表します。

func (StartElement) Copy

func (e StartElement) Copy() StartElement

Copyは、StartElementの新しいコピーを作成します。

func (StartElement) End added in v1.2.0

func (e StartElement) End() EndElement

Endは、対応するXML終了要素を返します。

type SyntaxError

type SyntaxError struct {
	Msg  string
	Line int
}

SyntaxErrorは、XML入力ストリームの構文エラーを表します。

func (*SyntaxError) Error

func (e *SyntaxError) Error() string

type TagPathError

type TagPathError struct {
	Struct       reflect.Type
	Field1, Tag1 string
	Field2, Tag2 string
}

TagPathErrorは、競合するパスを持つフィールドタグの使用によって アンマーシャル処理中に発生したエラーを表します。

func (*TagPathError) Error

func (e *TagPathError) Error() string

type Token

type Token any

Tokenは、次のトークンタイプのいずれかを保持するインターフェースです: StartElement、EndElement、CharData、Comment、ProcInst、またはDirective。

func CopyToken

func CopyToken(t Token) Token

CopyTokenは、Tokenのコピーを返します。

type TokenReader added in v1.10.0

type TokenReader interface {
	Token() (Token, error)
}

TokenReaderは、XMLトークンのストリームをデコードできるものを指します。 これには、Decoderも含まれます。

Tokenがトークンの読み取りに成功した後にエラーまたはファイル終了の状態に遭遇した場合、 それはそのトークンを返します。それは同じ呼び出しから(非nilの)エラーを返すか、 次の呼び出しからエラー(とnilトークン)を返すかもしれません。 この一般的なケースの一例は、トークンストリームの終わりで非nilのトークンを返すTokenReaderが、 io.EOFまたはnilエラーのどちらかを返す可能性があるということです。 次のReadはnil, io.EOFを返すべきです。

Tokenの実装は、nilトークンとnilエラーを返すことを推奨されていません。 呼び出し元はnil, nilの返り値を何も起こらなかったことを示すものとして扱うべきです。 特に、これはEOFを示すものではありません。

type UnmarshalError

type UnmarshalError string

UnmarshalErrorは、アンマーシャル処理中のエラーを表します。

func (UnmarshalError) Error

func (e UnmarshalError) Error() string

type Unmarshaler added in v1.2.0

type Unmarshaler interface {
	UnmarshalXML(d *Decoder, start StartElement) error
}

Unmarshalerは、自分自身のXML要素の説明をアンマーシャルできるオブジェクトが実装するインターフェースです。

UnmarshalXMLは、与えられた開始要素で始まる単一のXML要素をデコードします。 エラーを返す場合、外部のUnmarshalへの呼び出しは停止し、 そのエラーを返します。 UnmarshalXMLは正確に一つのXML要素を消費しなければなりません。 一般的な実装戦略の一つは、期待されるXMLに一致するレイアウトを持つ 別の値にアンマーシャルし、そのデータをレシーバにコピーすることです。 もう一つの一般的な戦略は、d.Tokenを使用してXMLオブジェクトを 一つずつトークンで処理することです。 UnmarshalXMLはd.RawTokenを使用してはなりません。

type UnmarshalerAttr added in v1.2.0

type UnmarshalerAttr interface {
	UnmarshalXMLAttr(attr Attr) error
}

UnmarshalerAttrは、自分自身のXML属性の説明をアンマーシャルできるオブジェクトが実装するインターフェースです。

UnmarshalXMLAttrは単一のXML属性をデコードします。 エラーを返す場合、外部のUnmarshalへの呼び出しは停止し、 そのエラーを返します。 UnmarshalXMLAttrは、フィールドタグに"attr"オプションを持つ構造体フィールドのみで使用されます。

type UnsupportedTypeError

type UnsupportedTypeError struct {
	Type reflect.Type
}

UnsupportedTypeErrorは、MarshalがXMLに変換できないタイプに遭遇したときに返されます。

func (*UnsupportedTypeError) Error

func (e *UnsupportedTypeError) Error() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL