>  기사  >  백엔드 개발  >  Go에서 속성과 부동 소수점 값을 사용하여 XML 요소를 역마샬링하는 방법은 무엇입니까?

Go에서 속성과 부동 소수점 값을 사용하여 XML 요소를 역마샬링하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-23 18:38:02823검색

How to Unmarshal XML Elements with Attributes and Floating-Point Values in Go?

Go에서 속성 및 부동 소수점 값이 있는 XML 요소 역마샬링

제공된 것과 같은 XML 요소를 속성 및 부동 소수점 값으로 역마샬링하려면 부동 소수점 값을 사용하려면 XML 구조에 해당하는 Go 구조체를 정의해야 합니다.

구조체 정의

질문:

첫 번째 정의:

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

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

두 번째 정의:

<code class="go">type ThingElem struct {
    XMLName xml.Name `xml:"thing"` // Do I even need this?
    Prop    int      `xml:"prop,attr"`
    Value   float    // ???
}</code>

옵션 해결 :

  • XMLName 속성: XMLName 속성은 일반적으로 구조체의 XML 요소 이름을 지정하는 데 사용되므로 이 경우에는 필요하지 않습니다. 요소 이름은 xml:"thing" 주석에 명시적으로 지정됩니다.
  • 부동 값 표현: 부동 소수점 값이 있기 때문에 첫 번째 구조체의 부동 필드를 올바르게 역마샬링할 수 없습니다. XML에는 공백이 포함되어 있습니다. 역마샬링하기 전에 이러한 공백을 제거해야 합니다.
  • 래퍼 또는 직접 포함: 두 번째 구조체 정의는 래퍼(ThingWrapper)를 사용하여 XML 요소를 나타냅니다. ThingElem 구조체는 이미 XML 구조를 정확하게 나타내기 때문에 이는 필요하지 않습니다.

최종 해결 방법:

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

type Root struct {
    Things []Thing `xml:"thing"`
}</code>

이 솔루션에서 Thing 구조체는 다음을 나타냅니다. 단일 XML 요소이고 Root 구조체는 XML 루트 요소를 역마샬링하기 위한 Thing 구조체 조각을 보유하는 컨테이너입니다.

예제 코드:

<code class="go">package main

import (
    "encoding/xml"
    "fmt"
)

const xmlData = `
<root>
<thing prop="1">1.23</thing>
<thing prop="2">4.56</thing>
</root>
`

func main() {
    root := &Root{}
    if err := xml.Unmarshal([]byte(xmlData), root); err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(root.Things)
}</code>

이 코드는 부동 소수점 값에서 공백을 제거하는 것을 포함하여 XML 요소를 Go 구조체로 역마샬링하는 방법을 보여줍니다.

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

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