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

Unmarshaling nummerierter XML-Tags in Go

PHPz
PHPznach vorne
2024-02-10 15:36:08947Durchsuche

在 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)
    }
}

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)
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen