Схват всех полей при попытке развязать вложенные XML файлы

87
10

Вот немного XML файла, который я пытаюсь вытащить в Голанг. Фактический файл XML составляет более 500 МБ.

<artists>
<artist>
<id>1</id>
<name>The Persuader</name>
<realname>Jesper Dahlbäck</realname>
<profile />
</artist>
<artist>
<id>22</id>
<name>DATacide</name>
<profile>Datacide began recording together in 1993, after Tetsu Inoue met Uwe Schmidt while vacationing near Frankfurt.
</profile>
<members>
<id>25</id>
<name>Tetsu Inoue</name>
<id>519207</id>
<name>Uwe Schmidt</name>
</members>
</artist>
</artists>

Здесь код Go. Я хочу получить ВСЕ поля ID в разделе MEMBERS, но мой код только захватывает последнее поле идентификатора, где может быть ни один, ни один или многие. Как я могу захватить все идентификаторы в разделе MEMBERS в массив MEMBERS?

package main

import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
)

type Artists struct {
XMLName xml.Name 'xml:"artists"'
Artist []Artist 'xml:"artist"'
}

type Artist struct {
XMLName xml.Name 'xml:"artist"'
ArtistID uint32 'xml:" id,omitempty"'
ArtistName string 'xml:" name,omitempty"'
Profile string 'xml:" profile,omitempty"'
RealName string 'xml:" realname,omitempty"'
Members MembersID 'xml:"members,omitempty"'
}

type MembersID struct {
MemberID uint32 'xml:"id,omitempty"'
}

func main() {

xmlFile, err := os.Open("short_artists.xml")
if err != nil {
fmt.Println(err)
}

fmt.Println("Successfully opened artists file")
defer xmlFile.Close()

byteValue, _ := ioutil.ReadAll(xmlFile)
var artists Artists
xml.Unmarshal(byteValue, &artists)

for i := 0; i < len(artists.Artist); i++ {
fmt.Println("ArtistID: " + fmt.Sprint(artists.Artist[i].ArtistID))
fmt.Println("Name: " + artists.Artist[i].ArtistName)
fmt.Println("Real Name: " + artists.Artist[i].RealName)
fmt.Println("Profile: " + artists.Artist[i].Profile)
fmt.Println("")
fmt.Printf("%v\n",artists.Artist[i].Members)
fmt.Println("")
}
}

Все мои поиски Google и DuckDuckGo фиолетовые. Спасибо за помощь.

спросил(а) 2021-01-19T22:47:37+03:00 2 месяца, 3 недели назад
1
Решение
62

Проблема - определение структуры MembersID. Вы должны использовать срез.

type MembersID struct {
MemberID []uint32 'xml:"id,omitempty"'
}

Ссылка на игру: https://play.golang.org/p/h4qTmSQoRg

Выход:

ArtistID: 1
Name: The Persuader
Real Name: Jesper Dahlbäck
Profile:

Members: []

ArtistID: 22
Name: DATacide
Real Name:
Profile: Datacide began recording together in 1993, after Tetsu Inoue met Uwe Schmidt while vacationing near Frankfurt.

Members: [25 519207]

Бонусный совет:

При необходимости выборочно извлекать значения пути XML. Например, получение всех идентификаторов XML файла path artist>members>id

type MemberID struct {
IDs []uint32 'xml:"artist>members>id"'
}

Ссылка на игру: https://play.golang.org/p/sj7XPisgl7

Выход:

[25 519207]

ответил(а) 2021-01-19T22:47:37+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема