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