daily pastebin goal
10%
SHARE
TWEET

Untitled

a guest Mar 26th, 2019 86 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }*/
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top