>  기사  >  백엔드 개발  >  Go에서 속성과 값을 사용하여 XML을 역정렬화하는 방법은 무엇입니까?

Go에서 속성과 값을 사용하여 XML을 역정렬화하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-24 00:37:02277검색

How to Unmarshal XML with Attributes and Values in Go?

Go에서 속성 및 값이 포함된 XML 요소 역마샬링

XML 요소에는 속성과 값이 모두 포함되는 경우가 많습니다. 이러한 요소를 Golang 구조체로 성공적으로 역마샬링하려면 XMLName 및 ",chardata" 주석의 역할을 이해하는 것이 중요합니다.

XMLName 없이 구조체 정의

다음을 고려하세요. 제공된 XML:

<code class="xml"><thing prop="1">
  1.23
</thing>
<thing prop="2">
  4.56
</thing></code>

XMLName 필드가 없는 해당 구조체는 다음과 같습니다.

<code class="go">type ThingElem struct {
    Prop  int   `xml:"prop,attr"`
    Value float64 `xml:",chardata"`
}</code>

Prop에는 xml:"prop,attr"이라는 주석이 추가되어 해당 구조체가 사물 요소. 값에 xml:",chardata" 주석을 달아 요소의 내용을 문자열로 유지해야 함을 지정합니다.

XMLName 이해

XMLName을 사용하여 다음 작업을 수행할 수 있습니다. 구조체의 XML 태그 이름을 명시적으로 정의합니다. 우리의 경우 XML 태그 이름은 구조체 이름(ThingElem)과 일치하므로 추론됩니다. 따라서 이 시나리오에서는 XMLName이 필요하지 않습니다.

래퍼 구조체 사용

XML 구조가 더 복잡하거나 모호할 수 있는 경우 래퍼 구조체를 사용할 수 있습니다. 추가 컨텍스트를 제공합니다. 예를 들어 XML의 루트 요소 내에 여러 사물 요소가 있는 경우:

<code class="xml"><root>
  <thing prop="1">
    1.23
  </thing>
  <thing prop="2">
    4.56
  </thing>
</root></code>

래퍼 구조체가 필요합니다.

<code class="go">type ThingWrapper struct {
    T ThingElem `xml:"thing"`
}</code>

여기서 T는 thing 요소.

언마샬링 고려 사항

제공된 XML 데이터의 경우 요소 값의 공백을 고려해야 합니다. XML은 기본적으로 공백을 유지하지 않으므로 값을 잘라내거나 xml:",innerxml" 주석을 사용할 수 있습니다.

결과 구조체는 다음과 같이 역마샬링될 수 있습니다.

<code class="go">package main

import (
    "encoding/xml"
    "fmt"
    "strings"
)

type Root struct {
    Things []Thing `xml:"thing"`
}

type Thing struct {
    Prop  int     `xml:"prop,attr"`
    Value float64 `xml:",chardata"`
}

func main() {
    data := `
<root>
<thing prop="1"> 1.23 </thing>
<thing prop="2"> 4.56 </thing>
</root>
`
    thing := &Root{}
    err := xml.Unmarshal([]byte(strings.TrimSpace(data)), thing)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(thing)
}</code>

위 내용은 Go에서 속성과 값을 사용하여 XML을 역정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.