Documentation
¶
Overview ¶
xmlパッケージは、XML名前空間を理解する シンプルなXML 1.0パーサーを実装します。
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 ¶
- Constants
- Variables
- func Escape(w io.Writer, s []byte)
- func EscapeText(w io.Writer, s []byte) error
- func Marshal(v any) ([]byte, error)
- func MarshalIndent(v any, prefix, indent string) ([]byte, error)
- func Unmarshal(data []byte, v any) error
- type Attr
- type CharData
- type Comment
- type Decoder
- func (d *Decoder) Decode(v any) error
- func (d *Decoder) DecodeElement(v any, start *StartElement) error
- func (d *Decoder) InputOffset() int64
- func (d *Decoder) InputPos() (line, column int)
- func (d *Decoder) RawToken() (Token, error)
- func (d *Decoder) Skip() error
- func (d *Decoder) Token() (Token, error)
- type Directive
- type Encoder
- type EndElement
- type Marshaler
- type MarshalerAttr
- type Name
- type ProcInst
- type StartElement
- type SyntaxError
- type TagPathError
- type Token
- type TokenReader
- type UnmarshalError
- type Unmarshaler
- type UnmarshalerAttr
- type UnsupportedTypeError
Examples ¶
Constants ¶
const ( // Headerは、[Marshal] の出力と一緒に使用するのに適した一般的なXMLヘッダーです。 // これはこのパッケージの出力に自動的に追加されるものではなく、便宜上提供されています。 Header = `<?xml version="1.0" encoding="UTF-8"?>` + "\n" )
Variables ¶
var HTMLAutoClose []string = htmlAutoClose
HTMLAutoCloseは、自動的に閉じるとみなすべきHTML要素のセットです。
[Decoder.Strict] と [Decoder.Entity] フィールドのドキュメンテーションを参照してください。
var HTMLEntity map[string]string = htmlEntity
HTMLEntityは、標準的なHTMLエンティティ文字の変換を含むエンティティマップです。
[Decoder.Strict] と [Decoder.Entity] フィールドのドキュメンテーションを参照してください。
Functions ¶
func Escape ¶
Escapeは EscapeText と同様ですが、エラーの戻り値を省略します。 これはGo 1.0との後方互換性のために提供されています。 Go 1.1以降を対象とするコードは EscapeText を使用するべきです。
func EscapeText ¶ added in v1.1.0
EscapeTextは、プレーンテキストデータsの適切にエスケープされたXML相当物をwに書き込みます。
func Marshal ¶
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" を持つフィールドは、XML要素としてではなく、 1つ以上の <![CDATA[ ... ]]> タグで囲まれた文字データとして書き込まれます。
- タグ ",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 ¶
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 ¶
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 Comment ¶
type Comment []byte
Commentは、<!--comment-->の形式のXMLコメントを表します。 バイトには、<!-- および --> のコメントマーカーは含まれません。
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 ¶
NewDecoderは、rから読み取る新しいXMLパーサーを作成します。 もしrが io.ByteReader を実装していない場合、NewDecoderは 自身でバッファリングを行います。
func NewTokenDecoder ¶ added in v1.10.0
func NewTokenDecoder(t TokenReader) *Decoder
NewTokenDecoderは、基礎となるトークンストリームを使用して新しいXMLパーサーを作成します。
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
InputOffsetは、現在のデコーダ位置の入力ストリームバイトオフセットを返します。 オフセットは、最近返されたトークンの終わりと次のトークンの始まりの位置を示します。
func (*Decoder) InputPos ¶ added in v1.19.0
InputPosは、現在のデコーダ位置の行と、行の1ベースの入力位置を返します。 位置は、最近返されたトークンの終わりの位置を示します。
func (*Decoder) Skip ¶
Skipは、最も最近消費された開始要素に一致する終了要素を消費するまでトークンを読み込みます。 ネストされた構造はスキップされます。 開始要素に一致する終了要素を見つけた場合、nilを返します。 それ以外の場合は、問題を説明するエラーを返します。
func (*Decoder) Token ¶
Tokenは、入力ストリームの次のXMLトークンを返します。 入力ストリームの終わりでは、Tokenはnil, io.EOF を返します。
返されたトークンデータのバイトスライスは、パーサーの内部バッファを参照し、 次のTokenへの呼び出しまでのみ有効です。バイトのコピーを取得するには、 CopyToken を呼び出すか、トークンのCopyメソッドを呼び出します。
Tokenは、<br>のような自己閉鎖要素を展開し、 連続した呼び出しで返される別々の開始要素と終了要素にします。
Tokenは、返される StartElement と EndElement トークンが適切にネストされ、 マッチしていることを保証します:もしTokenが予期しない終了要素や、 すべての予期される終了要素の前にEOFに遭遇した場合、エラーを返します。
[Decoder.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指示を表します。 バイトには、<! および > のマーカーは含まれません。
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 (*Encoder) Close ¶ added in v1.20.0
エンコーダを閉じます。これは、これ以上データが書き込まれないことを示します。 バッファリングされたXMLを基礎となるライターにフラッシュし、 書き込まれたXMLが無効である場合(例えば、閉じられていない要素を含む場合)にエラーを返します。
func (*Encoder) Encode ¶
Encodeは、vのXMLエンコーディングをストリームに書き込みます。
Goの値をXMLに変換する詳細については、Marshal のドキュメンテーションを参照してください。
Encodeは、戻る前に Encoder.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は、戻る前に Encoder.Flush を呼び出します。
func (*Encoder) EncodeToken ¶ added in v1.2.0
EncodeTokenは、与えられたXMLトークンをストリームに書き込みます。 StartElement と EndElement トークンが適切にマッチしていない場合、エラーを返します。
EncodeTokenは Encoder.Flush を呼び出しません。なぜなら、通常これは Encoder.Encode や Encoder.EncodeElement (またはそれらの間に呼び出されるカスタム Marshaler のMarshalXML)のような大きな操作の一部であり、 それらは終了時にFlushを呼び出します。 Encoderを作成し、EncodeやEncodeElementを使用せずに直接EncodeTokenを呼び出す呼び出し元は、 XMLが基礎となるライターに書き込まれることを確認するために、終了時にFlushを呼び出す必要があります。
EncodeTokenは、"xml"をTargetに設定した ProcInst を、ストリームの最初のトークンとしてのみ書き込むことを許可します。
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
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 StartElement ¶
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 ¶
SyntaxErrorは、XML入力ストリームの構文エラーを表します。
func (*SyntaxError) Error ¶
func (e *SyntaxError) Error() string
type TagPathError ¶
TagPathErrorは、競合するパスを持つフィールドタグの使用によって アンマーシャル処理中に発生したエラーを表します。
func (*TagPathError) Error ¶
func (e *TagPathError) Error() string
type Token ¶
type Token any
Tokenは、次のトークンタイプのいずれかを保持するインターフェースです: StartElement、EndElement、CharData、Comment、ProcInst、または Directive。
type TokenReader ¶ added in v1.10.0
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
UnmarshalerAttrは、自分自身のXML属性の説明をアンマーシャルできるオブジェクトが実装するインターフェースです。
UnmarshalXMLAttrは単一のXML属性をデコードします。 エラーを返す場合、外部の Unmarshal への呼び出しは停止し、 そのエラーを返します。 UnmarshalXMLAttrは、フィールドタグに"attr"オプションを持つ構造体フィールドのみで使用されます。
type UnsupportedTypeError ¶
UnsupportedTypeErrorは、Marshal がXMLに変換できないタイプに遭遇したときに返されます。
func (*UnsupportedTypeError) Error ¶
func (e *UnsupportedTypeError) Error() string