본문 바로가기

Slack 채널 정리

go 로 xml 파일 읽어서 db 에 저장

mariaDB의 polygon 타입 이용하기 위해 전처리했던 내용을 정리해서 올렸었는데( 특정 좌표가 어느 위치에 포함되어 있는지 찾기(ST_CONTAINS) ) 그 때 사용했던 python 스크립트를 연습삼아 go lang 으로 포팅해보았습니다.

package main

import (
	"database/sql"
	"encoding/xml"
	"fmt"
	"io/ioutil"
	"os"
	_ "github.com/go-sql-driver/mysql"
)

type Terminal struct {
	XMLName xml.Name `xml:"Terminal"`
	Bounds   []Bound   `xml:"Bound"`
}

type Bound struct {
	XMLName xml.Name `xml:"Bound"`
	Id string `xml:"id,attr"`
	Points []Point `xml:"Point"`
}

type Point struct {
	XMLName xml.Name `xml:"Point"`
	X string `xml:"x,attr"`
	Y string `xml:"y,attr"`
}

func main() {
	fp, err := os.Open("D:/Geofence_UTF_HSEDIT.xml")
	checkError(err)
	defer fp.Close()

	data, err := ioutil.ReadAll(fp)

	var terminal Terminal
	xmlerr := xml.Unmarshal(data, &terminal)
	checkError(xmlerr)

	db, err := sql.Open("mysql", "dbId:dbPwd@tcp(dbIp:dbPort)/dbName")
	checkError(err)
	defer db.Close()
	//fmt.Println(terminal)
	for i := 0; i < len(terminal.Bounds); i++ {
		points := terminal.Bounds[i].Points
		if len(points) > 0 {
			polTxt := ""
			for j := 0; j < len(points); j++ {
				polTxt += points[j].Y + " " + points[j].X + ", "
			}

			/*
				for _, point := range terminal.Bounds[i].Points {
					fmt.Printf("  - Point : %s - %s\n", point.X, point.Y)
				}
			*/
			polTxt += points[0].Y + " " + points[0].X
			polTxt = "POLYGON((" + polTxt + "))"
			//fmt.Println(polTxt)

			boundId := terminal.Bounds[i].Id
			fmt.Println("Bound ID : " + boundId)
			_, err := db.Exec("INSERT INTO evt_bound (bnd_id, bnd_pol) VALUES (?, POLYGONFROMTEXT(?))", boundId, polTxt)
			checkError(err)
	}

}

func checkError(err error) {
	if err != nil {
		panic(err)
	}
}

go 에서 xml, database 사용하는 기본적인 방법을 응용해보았습니다.