英文:
Different structs for same XML tag with different attributes
问题
假设我有这个XML:
<something>
<value type="item">
...
</value>
<value type="other">
...
</value>
</something>
我能否以某种方式将具有不同属性的值提取到结构体的不同字段中,例如:
type Something struct {
Item Item `xml:"value[type=item]"` // 元代码
Other Other `xml:"value[type=other]"`
}
这种做法可行吗?我应该使用什么作为xml:属性?
英文:
Let's say I have this XML:
<something>
<value type="item">
...
</value>
<value type="other">
...
</value>
</something>
Can I somehow extract the value with different attributes to different items on my struct, like:
type Something struct {
Item Item `xml:"value[type=item]"` // metacode
Other Other `xml:"value[type=other]"`
}
Is it possible? What should I use as the xml: attribute?
答案1
得分: 1
我不认为直接将按属性值区分的项目列表映射到特定字段是可能的。你需要将其映射到一个切片,就像下面的示例中的Items切片一样:
package main
import (
"encoding/xml"
"fmt"
)
func main() {
type Item struct {
Type string `xml:"type,attr"`
Value string `xml:",chardata"`
}
type Something struct {
XMLName xml.Name `xml:"something"`
Name string `xml:"name"`
Items []Item `xml:"value"`
}
var v Something
data := `
<something>
<name> toto </name>
<value type="item"> my item </value>
<value type="other"> my other value </value>
</something>
`
err := xml.Unmarshal([]byte(data), &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Println(v)
}
在解码后,你可以根据需要处理切片,提取值并将它们放入特定的字段中。
英文:
I do not think it is possible to directly map a list of items discriminated by an attribute value to specific fields. You need to map it to a slice, like in the following example (Items slice):
package main
import (
"encoding/xml"
"fmt"
)
func main() {
type Item struct {
Type string `xml:"type,attr"`
Value string `xml:",chardata"`
}
type Something struct {
XMLName xml.Name `xml:"something"`
Name string `xml:"name"`
Items []Item `xml:"value"`
}
var v Something
data := `
<something>
<name> toto </name>
<value type="item"> my item </value>
<value type="other"> my other value </value>
</something>
`
err := xml.Unmarshal([]byte(data), &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Println(v)
}
Up to you to process the slice after the decoding to extract the values and put them in specific fields if needed.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论