Gegeben ist z. B. folgende XML-Datei:
<libraries>
<library>
<path>/media/HD1/Movies/</path>
<playerpath></playerpath>
<exclude name="sample,tmp/,temp/,RECYCLE.BIN/"/>
<description>MyMovies</description>
<prebuf></prebuf>
<scrapeLibrary>true</scrapeLibrary>
</library>
</libraries>
Dann müssen entsprechend dem XML Schema die passenden Go Strukturen definiert werden. Es müssen nur die XML Elemente angeführt werden, welche auch ausgelesen werden sollen.
Das könnte dann z. B. so aussehen:
type LibrariesXml struct {
Library []LibraryXml `xml:"library"`
}
type LibraryXml struct {
Path string `xml:"path"`
Description string `xml:"description"`
}
Dann kann man noch eine Go Struktur definieren, in welcher die Anwendung die Daten erwartet.
Das könnte dann z. B. so aussehen:
type Library struct {
Path string
Description string
}
In diesem Trivialbeispiel hat diese zusätzliche Struktur keinen grossen Mehrwert. In komplexeren Fällen kann man aber so die Anwendung besser vom XML Schema entkoppeln.
Der Code zum Einlesen der XML-Datei könnte dann z. B. so aussehen:
func (config Configuration) readLibraries() []Library {
libs := make([]Library, 0)
libsFile, err := ioutil.ReadFile(config.LibraryPath)
if err != nil {
fmt.Println(err)
return nil
}
libsStruct := LibrariesXml{}
err = xml.Unmarshal(libsFile, &libsStruct)
if err != nil {
fmt.Println(err)
return nil
}
for _, lib := range libsStruct.Library {
libs = append(libs, Library{lib.Path, lib.Description})
}
return libs
}
Die eigentliche Arbeit wird in der Funktion xml.Unmarshal() erledigt: parsen der XML-Datei und umpacken in die Go-Struktur.
Das war's auch schon ...
Das war's auch schon ...