1 回答
TA贡献1772条经验 获得超8个赞
也捕获属性
您可以在结构中使用附加字段Useful
来捕获(类型切片的xml.Attr
)所有属性,如下所示:
Useful struct {
Attrs []xml.Attr `xml:",any,attr"`
Data string `xml:",innerxml"`
} `xml:"Useful"`
添加另一个属性时<Useful>:
<Useful someAttr="someVal" someAttr2="someVal2">
...
<Useful>
并使用 输出结果fmt.Printf("%+v", doc.Useful)
,输出将是(在Go Playground上尝试一下):
{Attrs:[{Name:{Space: Local:someAttr} Value:someVal} {Name:{Space: Local:someAttr2} Value:someVal2}] Data: <InnerField1>Inner field 1 value</InnerField1> <InnerField2>Inner field 2 value</InnerField2> <InnerField3>Inner field 3 value</InnerField3> }
真正获得完整的原始 XML
另一种更复杂的方法是使用xml.Decoder
标记读取输入,并标记 的开始和结束位置<Useful>
。然后你就可以获得完整的原始XML <Useful>
。
它可能是这样的:
dec := xml.NewDecoder(strings.NewReader(data))
var start, end int64
foundStart := false
for {
if !foundStart {
start = dec.InputOffset()
}
t, err := dec.Token()
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
}
if se, ok := t.(xml.StartElement); ok {
if se.Name.Local == "Useful" {
foundStart = true
}
}
if se, ok := t.(xml.EndElement); ok {
if se.Name.Local == "Useful" {
end = dec.InputOffset()
// We may break here, we got what we wanted
break
}
}
}
fmt.Println(data[start:end])
它输出(在Go Playground上尝试):
<Useful someAttr="someVal" someAttr2="someVal2">
<InnerField1>Inner field 1 value</InnerField1>
<InnerField2>Inner field 2 value</InnerField2>
<InnerField3>Inner field 3 value</InnerField3>
</Useful>
由于我们不处理 的内容,因此我们可以通过如下<Useful>
使用来加快速度:Decoder.Skip()
dec := xml.NewDecoder(strings.NewReader(data))
var start, end int64
for {
start = dec.InputOffset()
t, err := dec.Token()
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
}
if se, ok := t.(xml.StartElement); ok {
if se.Name.Local != "Useful" {
continue
}
if err := dec.Skip(); err != nil {
fmt.Println(err)
break
}
end = dec.InputOffset()
break
}
}
fmt.Println(data[start:end])
输出是一样的。在Go Playground上试试这个。
- 1 回答
- 0 关注
- 131 浏览
添加回答
举报