您可以为此目的使用标准库中的xml.Decoder。您可以使用xml.NewDecoder() 创建一个新的xml.Decoder,它期望io.Reader 从中读取数据。 net.Conn 符合条件,因为它实现了 io.Reader。 Decoder.Decode() 方法将读取和处理 1 个 XML 文档。
让我们看一个例子。源将包含 2 个连接的 XML 文档,我们调用 Decoder.Decode() 两次来读取和解析这 2 个文档。
XML 源:2 个 XML 文档 (2 <Person>):
const data = `<Person>
<Name>Bob</Name>
<Age>23</Age>
</Person>
<Person>
<Name>Alice</Name>
<Age>21</Age>
</Person>
`
Go struct 对 XML 文档进行建模:
type Person struct {
Name string
Age int
}
读取这 2 个 XML 文档的代码:
buf := bytes.NewBuffer([]byte(data))
d := xml.NewDecoder(buf)
for i := 0; i < 2; i++ {
p := Person{}
if err := d.Decode(&p); err != nil {
fmt.Println(err)
} else {
fmt.Printf("%+v\n", p)
}
}
输出(在Go Playground 上试试):
{Name:Bob Age:23}
{Name:Alice Age:21}
请注意,如果没有更多可用数据,Decoder.Decode() 将返回 io.EOF。要从输入中读取所有 XML 文档,您可以这样做:
for {
p := Person{}
if err := d.Decode(&p); err != nil {
if err == io.EOF {
fmt.Println("EOF, breaking")
break
}
fmt.Println(err)
} else {
fmt.Printf("%+v\n", p)
}
}
回到你的例子
如果您想读取通过 TCP 连接传输的 XML 文档,您可以简单地将 net.Conn 值(实现 io.Reader)传递给 xml.NewDecoder():
var con net.Conn
// Initialize / obtain connection
d := xml.NewDecoder(con)
var doc YourDocType
if err := d.Decode(&doc); err != nil {
// Handle error
return
}
// No error, use doc:
fmt.Printf("%+v", doc)