使用xml.Deprer从XMPP流中读取节。
conn, err := net.Dial("tcp", s.Addr+":5222")if err != nil { // handle error}dec := xml.NewDeprer(conn)使用解码器Token方法读取根文档元素,并跳过节之间的字符数据:
func readStartElement(dec *xml.Deprer) (xml.StartElement, error) { for { t, err := dec.Token() if err != nil { return xml.StartElement{}, err } switch t := t.(type) { case xml.StartElement: return t, nil } }}使用解码器的DepreElement方法读取一个节:
func readStanza(dec *xml.Deprer) (interface{}, error) { se, err := readStartElement(dec) if err != nil { return nil, err } var v interface{} switch se.Name.Space + " " + se.Name.Local { case "jabber:client message": v = &jabberMessage{} // jabberMessage is struct type defined by app for messages // Add other stanza types here. default: v = &struct{}{} } if err := dec.DepreElement(v, &se); err != nil { return nil, err } return v, nil}在readStanza的返回值上输入类型开关,以处理不同类型的已接收节。
客户端同步读取节。这是一个粗略的轮廓(忽略身份验证等)。
conn, err := net.Dial("tcp", s.Addr+":5222")if err != nil { // handle error}dec := xml.NewDeprer(conn)// read and discard root element_, err := readStartElement(dec)if err != nil { // handle error}// read stanzasfor { v, err := readStanza(dec) if err != nil { // handle error // must break out of loop on error } switch v := v.(type) { case *jabberMessage: // handle message case *someOtherStanzaType: // handle other stanza types // ... and so on }}


