Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.39 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "encoding/xml"
  6. "fmt"
  7. "io/ioutil"
  8. "os"
  9. )
  10.  
  11. type AddressObjects struct {
  12. Objects []Object `xml:"Object"`
  13. }
  14. //<Object AOGUID="lsiSzyPcTvergShKf8ZmcA==" PARENTGUID="Sj2XD1IORrmxbFDUynU1qA==" PARENTGUIDMUN="Sj2XD1IORrmxbFDUynU1qA==" EXTRAGUID="96a3geDbSOiqznW3H3HgTA==" AOLEVEL="3" CODE="4500700000000" FORMALNAME="Каргапольский"
  15. type Object struct {
  16. AOGUID string `xml:"AOGUID,attr"`
  17. PARENTGUID string `xml:"PARENTGUID,attr"`
  18. PARENTGUIDMUN string `xml:"PARENTGUIDMUN,attr"`
  19. EXTRAGUID string `xml:"EXTRAGUID,attr"`
  20. AOLEVEL string `xml:"AOLEVEL,attr"`
  21. CODE string `xml:"CODE,attr"`
  22. FORMALNAME string `xml:"FORMALNAME,attr"`
  23. SHORTNAME string `xml:"SHORTNAME,attr"`
  24. }
  25.  
  26. type Houses struct {
  27. Houses []House `xml:"House"`
  28. }
  29.  
  30. type House struct {
  31. AOGUID string `xml:"AOGUID,attr"`
  32. EXTRAGUID string `xml:"EXTRAGUID,attr"`
  33. BUILDINGS string `xml:"BUILDINGS,attr"`
  34. }
  35.  
  36. var houses Houses
  37. var addr AddressObjects
  38.  
  39. func findCity(name string) (city Object) {
  40. for _, obj := range addr.Objects {
  41. if obj.SHORTNAME == "г" && obj.FORMALNAME == name {
  42. return obj
  43. }
  44. }
  45. return city
  46. }
  47.  
  48.  
  49.  
  50. type City struct {
  51. streets map[string][]string // ключ - это имя города, значение - список домов
  52. }
  53.  
  54. // здесь храним закешированные данные
  55. var cities map[string]City
  56.  
  57. /*
  58.  
  59. 101а~~1~2 - первая цифра - номер дома, вторая цифра: 1 - строение, 2 - сооружение, последняя цифра номер строение
  60. еще бывает запись перевернута
  61. 0~~1~132б - это просто дом 132б*/
  62.  
  63. func Reverse(s string) (result string) {
  64. for _,v := range s {
  65. result = string(v) + result
  66. }
  67. return
  68. }
  69.  
  70. // из файла xml парсятся заданные области
  71. func Parse() (err error){
  72. xmlFile, err := os.Open("test.xml")
  73. defer xmlFile.Close()
  74. // if we os.Open returns an error then handle it
  75. if err != nil {
  76. panic(err)
  77. }
  78.  
  79. byteValue, _ := ioutil.ReadAll(xmlFile)
  80.  
  81.  
  82. // we unmarshal our byteArray which contains our
  83. // xmlFiles content into 'users' which we defined above
  84. err = xml.Unmarshal(byteValue, &addr)
  85.  
  86. if err != nil {
  87. return err
  88. }
  89.  
  90.  
  91. //temp_streets := make(map[string][]string)
  92.  
  93. name_streets := make(map[string]Object)
  94. a := []string{}
  95. /* парсим геообъекты с уидом нашего города*/
  96. for _, v := range(addr.Objects) {
  97. a = append(a, v.SHORTNAME + " " + v.FORMALNAME)
  98. name_streets[v.AOGUID] = v
  99. fmt.Println(v.AOGUID, v.FORMALNAME, v.SHORTNAME)
  100. }
  101.  
  102. result, _ := json.Marshal(a)
  103. err = ioutil.WriteFile("output.json", result, 777)
  104.  
  105. return err
  106. }
  107.  
  108.  
  109. func main() {
  110.  
  111. if err := Parse(); err != nil {
  112. panic(err)
  113. }
  114.  
  115. }
  116.  
  117.  
  118. /*
  119. func main() {
  120. cities = make(map[string]City)
  121.  
  122. //cities["Курган"]
  123.  
  124. Parse("Курган")
  125.  
  126. guid := "lsiSzyPcTvergShKf8ZmcA=="
  127. //uuid := "123e4567-e89b-12d3-a456-426655440000"
  128. //var escaper = strings.NewReplacer("9", "99", "-", "90", "_", "91")
  129. var unescaper = strings.NewReplacer("99", "9", "90", "-", "91", "_")
  130. fmt.Println("Verify decoding:")
  131. //s := []byte(guid)
  132. dec, err := base64.RawURLEncoding.DecodeString(unescaper.Replace(guid))
  133. res := []byte{}
  134. hex.Decode(res, dec)
  135. fmt.Printf("%s, %v\n", res, err)
  136.  
  137. return*/
  138. // Open our xmlFile
  139. /*xmlFile, err := os.Open("Курган/addrobj.xml")
  140. // if we os.Open returns an error then handle it
  141. if err != nil {
  142. panic(err)
  143. }
  144.  
  145. byteValue, _ := ioutil.ReadAll(xmlFile)
  146.  
  147.  
  148. // we unmarshal our byteArray which contains our
  149. // xmlFiles content into 'users' which we defined above
  150. err = xml.Unmarshal(byteValue, &addr)
  151.  
  152. if err != nil {
  153. panic(err)
  154. }
  155.  
  156.  
  157. // Open our xmlFile
  158. xmlFile, err = os.Open("Курган/house.xml")
  159. // if we os.Open returns an error then handle it
  160. if err != nil {
  161. panic(err)
  162. }
  163.  
  164. byteValue, _ = ioutil.ReadAll(xmlFile)
  165.  
  166.  
  167. // we unmarshal our byteArray which contains our
  168. // xmlFiles content into 'users' which we defined above
  169. err = xml.Unmarshal(byteValue, &houses)
  170.  
  171. if err != nil {
  172. panic(err)
  173. }
  174.  
  175. city := findCity("Курган")
  176. fmt.Println(city)
  177.  
  178. name_streets := make(map[string]Object)
  179.  
  180. for _, v := range(addr.Objects) {
  181. if v.PARENTGUID == city.AOGUID{
  182. name_streets[v.AOGUID] = v
  183. fmt.Println(v.AOGUID, v.FORMALNAME, v.SHORTNAME)
  184. }
  185. }
  186.  
  187. // здесь храним хеш улицы -> массив домов
  188. streets := make(map[string][]string)
  189.  
  190. // идем по домам
  191. for _, house := range(houses.Houses) {
  192. // парсим building, сепаратор это &#9;
  193. buildings := strings.Split(house.BUILDINGS, " ")
  194. //fmt.Println("Building:", buildings[0])
  195. // в улицах будем искать uuid
  196. _, ok := name_streets[house.AOGUID]
  197. //streets[house.AOGUID] = append(streets[house.AOGUID], house)
  198. // если нашли
  199. if ok {
  200. for _, v := range buildings {
  201. if v == "" {
  202. continue
  203. }
  204. // мы его разобъем на две части по ==, т.е. разделим на uuid и номер дома
  205. tmp := strings.Split(v, "==")
  206. number_house := tmp[1]
  207.  
  208. // если нашли
  209.  
  210. // если первая двойка, то удалим ее
  211. if number_house[0] == '2' {
  212. number_house = number_house[1:]
  213. }
  214. streets[house.AOGUID] = append(streets[house.AOGUID], number_house)
  215. fmt.Println(name_streets[house.AOGUID].SHORTNAME + " " + name_streets[house.AOGUID].FORMALNAME + " " + number_house)
  216.  
  217. }
  218. }
  219. }
  220.  
  221. /*for _, v := range streets["kWd0fCXfQf+chEWTc/LVyg=="] {
  222. fmt.Println(v)
  223. }*/
  224.  
  225.  
  226. /*// каждый элемент v выглядит примерно так SYNh7SJOQlibZYIIoqUifg==21
  227. for _, v := range(buildings) {
  228. // мы его разобъем на две части по ==, т.е. разделим на uuid и номер дома
  229. tmp := strings.Split(v, "==")
  230.  
  231. // восстановим uuid
  232. uuid := tmp[0] + "=="
  233. number_house := tmp[1]
  234. //fmt.Println(uuid)
  235. // и в улицах будем искать этот uuid
  236. street, ok := streets[uuid]
  237.  
  238. // если нашли
  239. if ok {
  240. fmt.Println(street.FORMALNAME + " " + number_house)
  241. }
  242.  
  243. }
  244.  
  245.  
  246.  
  247. fmt.Println("Successfully")
  248. // defer the closing of our xmlFile so that we can parse it later on
  249. defer xmlFile.Close()
  250. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement