我得到了以下XML结构
XML结构:
<assay>
<step id="1">
<command>
<bar>
<ab>structure 1</ab>
</bar>
<duration>5</duration>
</command>
</step>
<step id="2">
<command>
<bar>
<cd>structure 2</cd>
</bar>
<duration>5</duration>
</command>
</step>
<step id="3">
<command>
<bar>
<de>structure 3</de>
</bar>
<duration>5</duration>
</command>
</step>
<step id="4">
<command>
<bar>
<ab>structure 1</ab>
</bar>
<duration>5</duration>
</command>
</step>
</assay>
并在golang中创建以下结构
type Assay struct {
Steps []struct {
ID int `xml:"id"`
Duration int `xml:"duration"`
Instruction string `xml:"command>bar"`
Command Command `xml:"command"`
} `xml:"step"`
}
type Command struct {
Bar struct {
Ab *Ab struct {} `xml:"ab"`
Cd *Cd struct {} `xml:"cd"`
De *De struct {} `xml:"de"`
} `xml:bar`
}
是否可以在“说明”字段中写入bar元素(ab,cd,de)中元素的元素名称?我使用xml.Name来获得元素名称,但是我只能在ab,cd,ef结构中得到它。
另一个问题:Bar结构内部是否可能仅显示XML中的结构?
目前看来:
Bar {
Ab: {...some Informations}
Cd: {nil}
De:{nil}
}
Bar {
Ab: {nil}
Cd: {...some Informations}
De:{nil}
}
应该是:
Bar {
Ab: {...some Informations}
}
Bar {
Cd: {...some Informations}
}
我将XMl作为字符串接收,并使用以下代码将其解组:
func ExtractAssay(stringXML string) (structXML requests.Assay) {
stringByte := []byte(stringXML)
err := xml.Unmarshal(stringByte, &structXML)
if nil != err {
fmt.Println("Error unmarshalling from XML", err)
return
}
return structXML
}
答案 0 :(得分:0)
以下代码片段提供了完整的解码XML结构, 如果不想在编码为XML时包括ab,cd和de type,只需在om标签中添加ommitempty。
var XML = `<assay>
<step id="1">
<command>
<bar>
<ab>structure 1</ab>
</bar>
<duration>5</duration>
</command>
</step>
<step id="2">
<command>
<bar>
<cd>structure 2</cd>
</bar>
<duration>5</duration>
</command>
</step>
<step id="3">
<command>
<bar>
<de>structure 3</de>
</bar>
<duration>5</duration>
</command>
</step>
<step id="4">
<command>
<bar>
<ab>structure 1</ab>
</bar>
<duration>5</duration>
</command>
</step>
</assay>`
type Assay struct {
Steps []struct {
ID int `xml:"id"`
Duration int `xml:"duration"`
Command Command `xml:"command"`
} `xml:"step"`
}
type Ab struct {
Value string `xml:",chardata"`
}
type Cd struct {
Value string `xml:",chardata"`
}
type De struct {
Value string `xml:",chardata"`
}
type Bar struct {
Ab *Ab `xml:"ab,omitempty"`
Cd *Cd `xml:"cd,omitempty"`
De *De `xml:"de,omitempty"`
}
type Command struct {
Bar *Bar `xml:"bar"`
}
func main() {
var asSay = &Assay{}
err := xml.Unmarshal([]byte(XML), &asSay)
if err != nil {
log.Fatal(err)
}
for _, step := range asSay.Steps {
if step.Command.Bar != nil {
if step.Command.Bar.Ab != nil {
fmt.Printf("ab: %v\n", step.Command.Bar.Ab)
}
if step.Command.Bar.Cd != nil {
fmt.Printf("cd: %v\n", step.Command.Bar.Cd)
}
if step.Command.Bar.De != nil {
fmt.Printf("de: %v\n", step.Command.Bar.De)
}
}
}
}