xml - Golang : Read single XML document from net.康恩

标签 xml parsing networking go xml-parsing

我有一个客户端-服务器连接。它们通过 xml 进行通信,并且在一个 session 期间传输多个 xml 文档。 xml.Unmarshal 想要一片字节,但我不能只是 ReadAll 来自套接字的所有字节(它会尝试读取更多的单个 xml,因此会阻塞)。

是否有标准的 xml 解析器或库,可以从字节流中解析并读取不超过实际需要的数据?

最佳答案

您可以使用 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)

关于xml - Golang : Read single XML document from net.康恩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39700817/

相关文章:

parsing - ANTLR 不会自动进行前向匹配?

ssl - TLS/SSL 端点前的 TCP 负载平衡器

xml - xsl : how to translate or replace string?

sql-server - 安装 SQL Server 2012 时出现 XML 错误

java - 更新现场 Jar 文件中的文件

java - 如何解析通过 TCP 收到的损坏消息

http - POST 与 GET 方法——在网络层面,哪个受延迟影响更大?

java - 查找 xml 文件的 xpath

xml - 用于快速和肮脏的 XML 序列化的 Ruby 代码?

JavaScript 在每个父 div 之后插入 href 值