Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "encoding/json"
- "encoding/xml"
- "fmt"
- "io/ioutil"
- "os"
- )
- type AddressObjects struct {
- Objects []Object `xml:"Object"`
- }
- //<Object AOGUID="lsiSzyPcTvergShKf8ZmcA==" PARENTGUID="Sj2XD1IORrmxbFDUynU1qA==" PARENTGUIDMUN="Sj2XD1IORrmxbFDUynU1qA==" EXTRAGUID="96a3geDbSOiqznW3H3HgTA==" AOLEVEL="3" CODE="4500700000000" FORMALNAME="Каргапольский"
- type Object struct {
- AOGUID string `xml:"AOGUID,attr"`
- PARENTGUID string `xml:"PARENTGUID,attr"`
- PARENTGUIDMUN string `xml:"PARENTGUIDMUN,attr"`
- EXTRAGUID string `xml:"EXTRAGUID,attr"`
- AOLEVEL string `xml:"AOLEVEL,attr"`
- CODE string `xml:"CODE,attr"`
- FORMALNAME string `xml:"FORMALNAME,attr"`
- SHORTNAME string `xml:"SHORTNAME,attr"`
- }
- type Houses struct {
- Houses []House `xml:"House"`
- }
- type House struct {
- AOGUID string `xml:"AOGUID,attr"`
- EXTRAGUID string `xml:"EXTRAGUID,attr"`
- BUILDINGS string `xml:"BUILDINGS,attr"`
- }
- var houses Houses
- var addr AddressObjects
- func findCity(name string) (city Object) {
- for _, obj := range addr.Objects {
- if obj.SHORTNAME == "г" && obj.FORMALNAME == name {
- return obj
- }
- }
- return city
- }
- type City struct {
- streets map[string][]string // ключ - это имя города, значение - список домов
- }
- // здесь храним закешированные данные
- var cities map[string]City
- /*
- 101а~~1~2 - первая цифра - номер дома, вторая цифра: 1 - строение, 2 - сооружение, последняя цифра номер строение
- еще бывает запись перевернута
- 0~~1~132б - это просто дом 132б*/
- func Reverse(s string) (result string) {
- for _,v := range s {
- result = string(v) + result
- }
- return
- }
- // из файла xml парсятся заданные области
- func Parse() (err error){
- xmlFile, err := os.Open("test.xml")
- defer xmlFile.Close()
- // if we os.Open returns an error then handle it
- if err != nil {
- panic(err)
- }
- byteValue, _ := ioutil.ReadAll(xmlFile)
- // we unmarshal our byteArray which contains our
- // xmlFiles content into 'users' which we defined above
- err = xml.Unmarshal(byteValue, &addr)
- if err != nil {
- return err
- }
- //temp_streets := make(map[string][]string)
- name_streets := make(map[string]Object)
- a := []string{}
- /* парсим геообъекты с уидом нашего города*/
- for _, v := range(addr.Objects) {
- a = append(a, v.SHORTNAME + " " + v.FORMALNAME)
- name_streets[v.AOGUID] = v
- fmt.Println(v.AOGUID, v.FORMALNAME, v.SHORTNAME)
- }
- result, _ := json.Marshal(a)
- err = ioutil.WriteFile("output.json", result, 777)
- return err
- }
- func main() {
- if err := Parse(); err != nil {
- panic(err)
- }
- }
- /*
- func main() {
- cities = make(map[string]City)
- //cities["Курган"]
- Parse("Курган")
- guid := "lsiSzyPcTvergShKf8ZmcA=="
- //uuid := "123e4567-e89b-12d3-a456-426655440000"
- //var escaper = strings.NewReplacer("9", "99", "-", "90", "_", "91")
- var unescaper = strings.NewReplacer("99", "9", "90", "-", "91", "_")
- fmt.Println("Verify decoding:")
- //s := []byte(guid)
- dec, err := base64.RawURLEncoding.DecodeString(unescaper.Replace(guid))
- res := []byte{}
- hex.Decode(res, dec)
- fmt.Printf("%s, %v\n", res, err)
- return*/
- // Open our xmlFile
- /*xmlFile, err := os.Open("Курган/addrobj.xml")
- // if we os.Open returns an error then handle it
- if err != nil {
- panic(err)
- }
- byteValue, _ := ioutil.ReadAll(xmlFile)
- // we unmarshal our byteArray which contains our
- // xmlFiles content into 'users' which we defined above
- err = xml.Unmarshal(byteValue, &addr)
- if err != nil {
- panic(err)
- }
- // Open our xmlFile
- xmlFile, err = os.Open("Курган/house.xml")
- // if we os.Open returns an error then handle it
- if err != nil {
- panic(err)
- }
- byteValue, _ = ioutil.ReadAll(xmlFile)
- // we unmarshal our byteArray which contains our
- // xmlFiles content into 'users' which we defined above
- err = xml.Unmarshal(byteValue, &houses)
- if err != nil {
- panic(err)
- }
- city := findCity("Курган")
- fmt.Println(city)
- name_streets := make(map[string]Object)
- for _, v := range(addr.Objects) {
- if v.PARENTGUID == city.AOGUID{
- name_streets[v.AOGUID] = v
- fmt.Println(v.AOGUID, v.FORMALNAME, v.SHORTNAME)
- }
- }
- // здесь храним хеш улицы -> массив домов
- streets := make(map[string][]string)
- // идем по домам
- for _, house := range(houses.Houses) {
- // парсим building, сепаратор это 	
- buildings := strings.Split(house.BUILDINGS, " ")
- //fmt.Println("Building:", buildings[0])
- // в улицах будем искать uuid
- _, ok := name_streets[house.AOGUID]
- //streets[house.AOGUID] = append(streets[house.AOGUID], house)
- // если нашли
- if ok {
- for _, v := range buildings {
- if v == "" {
- continue
- }
- // мы его разобъем на две части по ==, т.е. разделим на uuid и номер дома
- tmp := strings.Split(v, "==")
- number_house := tmp[1]
- // если нашли
- // если первая двойка, то удалим ее
- if number_house[0] == '2' {
- number_house = number_house[1:]
- }
- streets[house.AOGUID] = append(streets[house.AOGUID], number_house)
- fmt.Println(name_streets[house.AOGUID].SHORTNAME + " " + name_streets[house.AOGUID].FORMALNAME + " " + number_house)
- }
- }
- }
- /*for _, v := range streets["kWd0fCXfQf+chEWTc/LVyg=="] {
- fmt.Println(v)
- }*/
- /*// каждый элемент v выглядит примерно так SYNh7SJOQlibZYIIoqUifg==21
- for _, v := range(buildings) {
- // мы его разобъем на две части по ==, т.е. разделим на uuid и номер дома
- tmp := strings.Split(v, "==")
- // восстановим uuid
- uuid := tmp[0] + "=="
- number_house := tmp[1]
- //fmt.Println(uuid)
- // и в улицах будем искать этот uuid
- street, ok := streets[uuid]
- // если нашли
- if ok {
- fmt.Println(street.FORMALNAME + " " + number_house)
- }
- }
- fmt.Println("Successfully")
- // defer the closing of our xmlFile so that we can parse it later on
- defer xmlFile.Close()
- }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement