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 關注
- 176 瀏覽
添加回答
舉報