首頁  >  文章  >  後端開發  >  在 Go 中解組編號的 XML 標籤

在 Go 中解組編號的 XML 標籤

PHPz
PHPz轉載
2024-02-10 15:36:08911瀏覽

在 Go 中解组编号的 XML 标签

php小編香蕉為您介紹在Go語言中解組編號的XML標籤的方法。 Go語言提供了xml.Unmarshal函數,它可以將XML資料解組為Go結構體。在解組時,我們可以使用標籤來指定XML元素與結構體欄位之間的對應關係。透過在結構體欄位的標籤中加入`xml:"tagname"`,我們可以將XML中的特定標籤與結構體欄位關聯起來,實現自動的解組操作。這種方法簡單且高效,使得在Go語言中處理XML資料變得輕鬆愉快。

問題內容

我嘗試了很多結構來嘗試解組此 xml,但我無法真正弄清楚:

package main

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

type SettingContainer struct {
    XMLName  xml.Name  `xml:"Settings"`
    Settings []Setting `xml:",any"`
}

type Setting struct {
    XMLName          xml.Name          `xml:",any"`
    SettingRegisters []SettingRegister `xml:",any"`
}

type SettingRegister struct {
    XMLName xml.Name `xml:",any"`
    Value   string   `xml:"value,attr"`
}

func main() {
    var xmlData = bytes.NewBufferString(`
    <Settings>
        <Setting0>
            <Setting0_register value="0x20" />
            <Setting0ArbitraryName value="0x0" />
        </Setting0>
        <Setting1>
            <Setting1_register value="0x60" />
            <Setting1WhateverEnable value="0x0" />
        </Setting1>
        <Setting2>
            <Setting2_register value="0x80" />
            <Setting2blahblah value="0x1" />
        </Setting2>
        <Setting4>
            <Setting4_register value="0x2fffff8" />
            <Setting4ThisCanBeAnything value="0x0" />
        </Setting4>
    </Settings>`)

    var s []SettingContainer
    xml.Unmarshal(xmlData.Bytes(), &s)

    for _, i := range s {
        fmt.Println(i)
    }
}

我就是無法讓它列印任何東西。我實際需要的欄位是settingn_register 的值attr 以及settingn 標籤名稱。我怎麼能正確地將 xml 解組到這些字段中?我正在考慮製作一個自訂解組函數,但我真的找不到如何正確製作一個函數。我從這個 xml 中只能得到“settings”標籤名稱。

解決方法

xmlname 欄位中刪除xml:",any" 標記(這會導致解碼器嘗試將額外的子元素對應到此欄位),並將其解組為settingcontainer 而不是[]settingcontainer 作為xml文件只能有一個根元素。此處的工作範例:https://www.php.cn/link/d2949eb6aaa490c835219e945ff37dad

type SettingContainer struct {
    XMLName  xml.Name  `xml:"Settings"`
    Settings []Setting `xml:",any"`
}

type Setting struct {
    XMLName          xml.Name
    SettingRegisters []SettingRegister `xml:",any"`
}

type SettingRegister struct {
    XMLName xml.Name
    Value   string `xml:"value,attr"`
}

func main() {
    var xmlData = bytes.NewBufferString(`...`)

    var s SettingContainer
    xml.Unmarshal(xmlData.Bytes(), &s)

    fmt.Println(s)
}

以上是在 Go 中解組編號的 XML 標籤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除