@cascado

Как при использовании encoding/xml распарсить XML-элемент с произвольными атрибутами?

Добрый день. Требуется распарсить вот такой элемент XML-элемент. Мне заранее не известны все варианты атрибутов, хотелось бы их как-нибудь собрать кучкой, например в словарь. Сейчас примерно вот такой код, но он реализует лишь извлечение значений из всех нод, но не атрибутов. Возможно ли это, возможно есть какие-то кастомные пакеты для сих действий, может у кого есть пример реализации через interface{}, подкиньте идей. Заранее благодарю.
  • Вопрос задан
  • 565 просмотров
Решения вопроса 1
@ogrim
type Rewards struct {
	XMLName xml.Name `xml:"rewards"`
	Rewards []Reward `xml:"reward"`
}

type Reward struct {
	Value string
	Attrs map[string]string
}

func (r *Reward) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
	r.Attrs = make(map[string]string)
	for _, attr := range start.Attr {
		r.Attrs[attr.Name.Local] = attr.Value
	}
	if err := d.DecodeElement(&r.Value, &start); err != nil {
		return err
	}
	return nil
}
// ...
var obj Rewards
if err := xml.Unmarshal(data, &obj); err != nil {
	log.Fatal(err)
}
log.Printf("%+v", obj.Rewards)

[{Value:100 Attrs:map[type:money slot:101 repeated:1]} {Value:1 Attrs:map[bagId:1 repeated:1 type:freedomBagsExp]} {Value:30 Attrs:map[repeated:1 type:rating]} {Value:1 Attrs:map[repeated:1 type:key key_id:2]} {Value:30 Attrs:map[type:guildAP repeated:1]} {Value:2 Attrs:map[key_id:2 repeated:1 type:key]} {Value:476 Attrs:map[repeated:1 type:rating]}]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы