Go での属性と値を使用した XML 要素のアンマーシャリング
XML 要素には、多くの場合、属性と値の両方が含まれます。このような要素を Golang 構造体に正常にアンマーシャリングするには、XMLName および ",chardata" アノテーションの役割を理解することが不可欠です。
XMLName を使用しない構造体の定義
指定された XML:
<code class="xml"><thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing></code>
XMLName フィールドのない対応する構造体は次のようになります。
<code class="go">type ThingElem struct { Prop int `xml:"prop,attr"` Value float64 `xml:",chardata"` }</code>
Prop には、それが属性であることを示す xml:"prop,attr" の注釈が付けられます。物の要素。値には、要素の内容を文字列として保持する必要があることを指定するために、xml:",chardata" の注釈が付けられます。
XMLName について
XMLName は、次の目的で使用できます。構造体の XML タグ名を明示的に定義します。この場合、XML タグ名は構造体名 (ThingElem) と一致するため、推測されます。したがって、このシナリオでは XMLName は必要ありません。
ラッパー構造体の使用
XML 構造がより複雑であるか、曖昧である可能性がある場合は、ラッパー構造体を使用できます。追加のコンテキストを提供します。たとえば、XML のルート要素内に複数の Thing 要素がある場合:
<code class="xml"><root> <thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing> </root></code>
ラッパー構造体が必要になります:
<code class="go">type ThingWrapper struct { T ThingElem `xml:"thing"` }</code>
ここで、T は、 thing 要素。
アンマーシャリングに関する考慮事項
提供された XML データの場合、要素値の空白を考慮する必要があります。 XML はデフォルトでは空白を保持しないため、値をトリミングするか、xml:",innerxml" 注釈を使用する必要があります。
結果の構造体は次のようにアンマーシャリングできます。
<code class="go">package main import ( "encoding/xml" "fmt" "strings" ) type Root struct { Things []Thing `xml:"thing"` } type Thing struct { Prop int `xml:"prop,attr"` Value float64 `xml:",chardata"` } func main() { data := ` <root> <thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing> </root> ` thing := &Root{} err := xml.Unmarshal([]byte(strings.TrimSpace(data)), thing) if err != nil { fmt.Println(err) return } fmt.Println(thing) }</code>
以上がGo で属性と値を使用して XML をアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。