main.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/xml"
  5. "fmt"
  6. "io"
  7. )
  8. type User struct {
  9. ID int `xml:"id,attr"`
  10. Login string `xml:"login"`
  11. Name string `xml:"name"`
  12. Browser string `xml:"browser"`
  13. }
  14. type Users struct {
  15. Version string `xml:"version,attr"`
  16. List []User `xml:"user"`
  17. }
  18. func CountStruct() {
  19. logins := make([]string, 0)
  20. v := new(Users)
  21. err := xml.Unmarshal(xmlData, &v)
  22. if err != nil {
  23. fmt.Printf("error: %v", err)
  24. return
  25. }
  26. for _, u := range v.List {
  27. logins = append(logins, u.Login)
  28. }
  29. }
  30. func CountDecoder() {
  31. input := bytes.NewReader(xmlData)
  32. decoder := xml.NewDecoder(input)
  33. logins := make([]string, 0)
  34. var login string
  35. for {
  36. tok, tokenErr := decoder.Token()
  37. if tokenErr != nil && tokenErr != io.EOF {
  38. fmt.Println("error happend", tokenErr)
  39. break
  40. } else if tokenErr == io.EOF {
  41. break
  42. }
  43. if tok == nil {
  44. fmt.Println("t is nil break")
  45. }
  46. switch tok := tok.(type) {
  47. case xml.StartElement:
  48. if tok.Name.Local == "login" {
  49. if err := decoder.DecodeElement(&login, &tok); err != nil {
  50. fmt.Println("error happend", err)
  51. }
  52. logins = append(logins, login)
  53. }
  54. }
  55. }
  56. }
  57. /*
  58. go test -bench . -benchmem xml_test.go
  59. */
  60. func main() {
  61. CountStruct()
  62. CountDecoder()
  63. }
  64. var xmlData = []byte(`<?xml version="1.0" encoding="utf-8"?>
  65. <users>
  66. <user id="1">
  67. <login>user1</login>
  68. <name>Василий Романов</name>
  69. <browser>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
  70. </browser>
  71. </user>
  72. <user id="2">
  73. <login>user2</login>
  74. <name>Иван Иванов</name>
  75. <browser>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
  76. </browser>
  77. </user>
  78. <user id="2">
  79. <login>user3</login>
  80. <name>Иван Петров</name>
  81. <browser>Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Trident/5.0)</browser>
  82. </user>
  83. <user id="1">
  84. <login>user1</login>
  85. <name>Василий Романов</name>
  86. <browser>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
  87. </browser>
  88. </user>
  89. <user id="2">
  90. <login>user2</login>
  91. <name>Иван Иванов</name>
  92. <browser>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
  93. </browser>
  94. </user>
  95. <user id="2">
  96. <login>user3</login>
  97. <name>Иван Петров</name>
  98. <browser>Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Trident/5.0)</browser>
  99. </user>
  100. <user id="2">
  101. <login>user3</login>
  102. <name>Иван Петров</name>
  103. <browser>Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Trident/5.0)</browser>
  104. </user>
  105. <user id="1">
  106. <login>user1</login>
  107. <name>Василий Романов</name>
  108. <browser>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
  109. </browser>
  110. </user>
  111. <user id="2">
  112. <login>user2</login>
  113. <name>Иван Иванов</name>
  114. <browser>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
  115. </browser>
  116. </user>
  117. <user id="2">
  118. <login>user3</login>
  119. <name>Иван Петров</name>
  120. <browser>Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Trident/5.0)</browser>
  121. </user>
  122. <user id="2">
  123. <login>user3</login>
  124. <name>Иван Петров</name>
  125. <browser>Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Trident/5.0)</browser>
  126. </user>
  127. <user id="1">
  128. <login>user1</login>
  129. <name>Василий Романов</name>
  130. <browser>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
  131. </browser>
  132. </user>
  133. <user id="2">
  134. <login>user2</login>
  135. <name>Иван Иванов</name>
  136. <browser>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
  137. </browser>
  138. </user>
  139. <user id="2">
  140. <login>user3</login>
  141. <name>Иван Петров</name>
  142. <browser>Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Trident/5.0)</browser>
  143. </user>
  144. </users>`)