XML 사용

1. XML 인코딩

Go 데이타를 XML 포맷으로 변환(인코딩)하기 위해서는 encoding/xml 패키지의 Marshal() 함수를 사용한다. 아래 예제는 Go 구조체를 XML로 인코딩하는 코드인데, 해당 Go 데이타 값을 xml.Marshal()의 파라미터로 전달하면, Marshal() 함수는 XML으로 인코딩된 바이트배열과 에러객체를 리턴한다. 만약 인코딩된 바이트배열을 다시 문자열로 변경할 필요가 있다면, string(바이트배열)과 같이 변경할 수 있다.

package main

import (
	"encoding/xml"
	"fmt"
)

//Member -
type Member struct {
	Name   string
	Age    int
	Active bool
}

func main() {
	mem := Member{"Alex", 10, true}

	xmlBytes, err := xml.Marshal(mem)
	if err != nil {
		panic(err)
	}

	xmlString := string(xmlBytes)
	fmt.Println(xmlString)
}

2. XML 디코딩

XML으로 인코딩된 데이타를 다시 Go 타입으로 디코딩하기 위해서는 encoding/xml 패키지의 Unmarshal() 함수를 사용한다. Unmarshal() 함수의 첫번째 파라미터에는 XML 데이타를, 두번째 파라미터에는 출력할 구조체 포인터를 지정한다. 리턴값은 에러객체이고, 에러가 없을 경우, 두번째 파라미터에 원래 데이타가 복원된다.

func main() {
	// 테스트용 데이타
	xmlBytes, _ := xml.Marshal(Member{"Tim", 1, true})

	// XML 디코딩
	var mem Member
	err := xml.Unmarshal(xmlBytes, &mem)
	if err != nil {
		panic(err)
	}
	
	// mem 구조체 필드 엑세스
	fmt.Println(mem.Name, mem.Age, mem.Active)
}

3. XML 파일 읽기

흔히 XML으로 저장된 파일을 읽어 Go 타입으로 디코딩 (혹은 Deserialization)하여 사용하는 경우가 많은데, 아래 예제는 이를 예시한 것이다. 즉, 아래와 같은 XML 텍스트 파일을 읽어 들여, 이를 Members 구조체로 디코딩한 예제이다.

<Members>
	<Member>
		<Name>Alex</Name>
		<Age>10</Age>
		<Active>true</Active>
	</Member>	
	<Member>
		<Name>Tim</Name>
		<Age>12</Age>
		<Active>false</Active>
	</Member>
</Members>
package main

import (
	"encoding/xml"
	"fmt"
	"io/ioutil"
	"os"
)

//Member -
type Member struct {
	Name   string
	Age    int
	Active bool
}

//Members -
type Members struct {
	Member []Member
}

func main() {
	// xml 파일 오픈
	fp, err := os.Open("c:/temp/test.xml")
	if err != nil {
		panic(err)
	}
	defer fp.Close()

	// xml 파일 읽기
	data, err := ioutil.ReadAll(fp)

	// xml 디코딩
	var members Members
	xmlerr := xml.Unmarshal(data, &members)
	if xmlerr != nil {
		panic(xmlerr)
	}

	fmt.Println(members)
}