XMLをアンマーシャリングするときに、<Text Language="de">...</Text>
(は以下に示すように)を削除するにはどうすればよいですか?アンマーシャリング時に要素をスキップする方法は?
私はUnmarshalXML
メソッドで要素をスキップしようとしましたが、そのときに要素全体をスキップしています。
import (
"encoding/xml"
"fmt"
)
type Root struct {
Translation []Text `xml:"Texts>Text>Text"`
}
type Text struct {
Language string `xml:"Language,attr"`
Value string `xml:"Value"`
}
func main() {
foo := `
<Root>
<Texts>
<Text>
<Text Language="EN">
<Value>One</Value>
</Text>
<Text Language="de">
<Value>Eins</Value>
</Text>
</Text>
</Texts>
</Root>
`
var root Root
e := xml.Unmarshal([]byte(foo), &root)
if e != nil {
panic(e)
}
fmt.Printf("%+v\n", root)
}
func (t *Text) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
tx := struct{ Language, Value string }{}
if start.Attr[0].Value == "EN" {
d.DecodeElement(&tx, &start)
// I couldn't got Language attr here
*t = Text{tx.Language, tx.Value}
// fmt.Printf("hey: %+v %s\n", tx, start.Attr[0].Value)
} else {
// It outputs DE element with empty fields
d.Skip()
}
return nil
}
メイン電流出力パッケージ:
{Translation:[{Language: Value:One} {Language: Value:}]}
私が欲しいもの:
{Translation:[{Language:EN Value:One}]}
平野アンマーシャリングおよび後処理あなたは、このような何かを試みることができます。 – Volker
答えを見て、方法があります。 –