Go에서 XML 처리
Wenhao Wang
Dev Intern · Leapcell

Key Takeaways
- Go의
encoding/xml패키지를 사용하면 효율적인 XML 파싱 및 생성이 가능합니다. Unmarshal및Marshal함수는 구조체 기반 매핑을 통해 XML 데이터 처리를 간소화합니다.xml.Decoder를 사용한 스트리밍은 대용량 XML 파일을 처리하는 데 최적입니다.
XML(eXtensible Markup Language)은 구조화된 데이터를 나타내는 데 널리 사용되는 형식입니다. Go에서 표준 라이브러리는 XML 파싱 및 생성을 위한 포괄적인 지원을 제공하는 encoding/xml 패키지를 제공합니다. 이 기사에서는 Go에서 XML을 사용하는 방법, 마샬링(인코딩) 및 언마샬링(디코딩) 프로세스를 모두 다룹니다.
Unmarshal을 사용하여 XML 파싱
XML 데이터를 Go 구조체로 파싱하려면 encoding/xml 패키지의 Unmarshal 함수를 사용합니다. 이 함수는 XML 데이터를 지정된 구조체로 디코딩하여 Go 프로그램 내에서 데이터를 쉽게 조작할 수 있도록 합니다.
예는 다음과 같습니다.
package main import ( "encoding/xml" "fmt" "os" ) type Server struct { ServerName string `xml:"serverName"` ServerIP string `xml:"serverIP"` } type Servers struct { XMLName xml.Name `xml:"servers"` Version string `xml:"version,attr"` Svs []Server `xml:"server"` } func main() { file, err := os.Open("servers.xml") if err != nil { fmt.Printf("error: %v", err) return } defer file.Close() var servers Servers if err := xml.NewDecoder(file).Decode(&servers); err != nil { fmt.Printf("error: %v", err) return } fmt.Println(servers) }
이 예제에서 Servers 구조체는 XML의 루트 요소를 나타내며, version 속성과 Server 구조체 슬라이스를 갖습니다. 각 Server에는 serverName 및 serverIP 요소가 포함되어 있습니다. 구조체 필드의 xml 태그는 XML 요소 및 속성을 구조체 필드에 매핑하여 언마샬링 프로세스를 안내합니다.
Marshal을 사용하여 XML 생성
Go 구조체에서 XML을 생성하려면 Marshal 또는 MarshalIndent 함수를 사용합니다. 이러한 함수는 Go 구조체를 XML 형식으로 직렬화합니다.
방법은 다음과 같습니다.
package main import ( "encoding/xml" "fmt" "os" ) type Server struct { ServerName string `xml:"serverName"` ServerIP string `xml:"serverIP"` } type Servers struct { XMLName xml.Name `xml:"servers"` Version string `xml:"version,attr"` Svs []Server `xml:"server"` } func main() { servers := &Servers{Version: "1"} servers.Svs = append(servers.Svs, Server{"Shanghai_VPN", "127.0.0.1"}) servers.Svs = append(servers.Svs, Server{"Beijing_VPN", "127.0.0.2"}) output, err := xml.MarshalIndent(servers, " ", " ") if err != nil { fmt.Printf("error: %v\n", err) return } os.Stdout.Write([]byte(xml.Header)) os.Stdout.Write(output) }
이 코드는 다음 XML을 생성합니다.
<?xml version="1.0" encoding="UTF-8"?> <servers version="1"> <server> <serverName>Shanghai_VPN</serverName> <serverIP>127.0.0.1</serverIP> </server> <server> <serverName>Beijing_VPN</serverName> <serverIP>127.0.0.2</serverIP> </server> </servers>
여기서 MarshalIndent 함수는 들여쓰기된(예쁘게 인쇄된) XML 출력을 생성하는 데 사용되어 가독성을 높입니다.
대용량 XML 파일 처리
대용량 XML 파일을 처리할 때는 스트림 파싱을 위해 xml.Decoder를 사용하는 것이 더 효율적입니다. 이 접근 방식을 사용하면 XML 데이터를 점진적으로 처리하여 메모리 소비를 줄일 수 있습니다.
예는 다음과 같습니다.
package main import ( "encoding/xml" "fmt" "os" ) type UserData struct { Name string `xml:"name"` Age int32 `xml:"age"` } func main() { file, err := os.Open("userdata.xml") if err != nil { fmt.Printf("error: %v\n", err) return } defer file.Close() decoder := xml.NewDecoder(file) for { token, err := decoder.Token() if err != nil { break } switch se := token.(type) { case xml.StartElement: if se.Name.Local == "user" { var user UserData if err := decoder.DecodeElement(&user, &se); err != nil { fmt.Printf("error: %v\n", err) continue } fmt.Printf("User: %+v\n", user) } } } }
이 예제에서 xml.Decoder는 XML 파일에서 토큰을 한 번에 하나씩 읽어 전체 콘텐츠를 메모리에 로드하지 않고도 대용량 파일을 효율적으로 처리할 수 있습니다.
결론
Go의 encoding/xml 패키지는 XML 데이터를 파싱하고 생성하는 데 모두 강력한 도구를 제공합니다. 구조체 태그와 패키지의 함수를 활용하여 개발자는 작은 구성이든 큰 데이터 세트이든 애플리케이션에서 XML을 효과적으로 처리할 수 있습니다.
FAQs
구조체 필드 태그와 함께 xml.Unmarshal 또는 xml.NewDecoder().Decode()를 사용합니다.
MarshalIndent는 가독성을 높이기 위해 XML을 들여쓰기로 형식을 지정합니다.
스트림에서 데이터를 효율적으로 처리하기 위해 대용량 파일에는 xml.Decoder를 사용합니다.
Leapcell은 Go 프로젝트 호스팅을 위한 최고의 선택입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무료로 무제한 프로젝트 배포
- 사용량에 대해서만 지불하십시오. 요청도 없고 요금도 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하십시오.
- 예: $25는 60ms 평균 응답 시간으로 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 쉬운 동시성 처리를 위한 자동 스케일링.
- 제로 운영 오버헤드 — 빌드에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ



