Heim > Backend-Entwicklung > Golang > Unmarshaling nummerierter XML-Tags in Go

Unmarshaling nummerierter XML-Tags in Go

PHPz
Freigeben: 2024-02-10 15:36:08
nach vorne
957 Leute haben es durchsucht

在 Go 中解组编号的 XML 标签

Der PHP-Editor Banana führt Sie in die Methode zum Unmarshaling nummerierter XML-Tags in der Go-Sprache ein. Die Go-Sprache stellt die Funktion xml.Unmarshal bereit, mit der XML-Daten in eine Go-Struktur entmarshmiert werden können. Beim Unmarshalling können wir Tags verwenden, um die Zuordnungsbeziehung zwischen XML-Elementen und Strukturfeldern anzugeben. Durch Hinzufügen von „xml:“tagname“ zum Tag des Strukturfelds können wir bestimmte Tags in XML mit dem Strukturfeld verknüpfen, um automatische Unmarshalling-Vorgänge zu erreichen. Diese Methode ist einfach und effizient und macht die Verarbeitung von XML-Daten in der Go-Sprache einfach und angenehm.

Frageninhalt

Ich habe viele Strukturen ausprobiert, um diese XML-Datei zu entmarshalieren, aber ich komme nicht wirklich dahinter:

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)
    }
}
Nach dem Login kopieren

Ich schaffe es einfach nicht, etwas zu drucken. Die Felder, die ich tatsächlich benötige, sind das Wertattr von „settingn_register“ und der Tagname „settingn“. Wie kann ich die XML-Datei korrekt in diese Felder entpacken? Ich denke darüber nach, eine benutzerdefinierte Unmarshalling-Funktion zu erstellen, kann aber nicht wirklich herausfinden, wie ich eine richtig erstellen kann. Ich erhalte nur den Tag-Namen „settings“ aus dieser XML-Datei.

Lösung

Von xmlname 字段中删除 xml:",any" 标记(这会导致解码器尝试将额外的子元素映射到此字段),并将其解组为 settingcontainer 而不是 []settingcontainer Da ein XML-Dokument nur ein Stammelement haben kann. Arbeitsbeispiel hier: 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)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonUnmarshaling nummerierter XML-Tags in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage