Моя текущая задача - прочитать различные полезные данные xml, поступающие в систему с golang. Полезные данные xml могут иметь разные имена тегов root. Другое имя тега root означает, что xml имеет совершенно другое значение. Я уже давно играю с кодировкой / xml, но я не нашел способа прочитать эти xml полезные нагрузки одним вызовом Unmarshal, не манипулируя им перед или не выполняя предварительный анализ, чтобы извлеките имя root.
Это упрощенный пример выполняемой задачи, отдельно читая 2 xmls:
package main
import (
"fmt"
"encoding/xml"
)
type Boxes struct {
Length []float64
}
type Bottles struct {
Diameter []float64
}
var Box_xml = []byte("<Boxes><Length>45</Length><Length>41</Length></Boxes>")
var Bottle_xml = []byte("<Bottles><Diameter>23</Diameter><Diameter>25</Diameter></Bottles>")
func main() {
box := Boxes{}
xml.Unmarshal(Box_xml, &box)
bottle := Bottles{}
xml.Unmarshal(Bottle_xml, &bottle)
fmt.Println(box, bottle)
}
Этот код печатает
{[45 41]} {[23 25]}
Мое текущее «лучшее» решение для обработки произвольного входящего сообщения за один вызов - добавить тег root к этим xmls и прочитать их в центральной структуре, например:
package main
import (
"fmt"
"encoding/xml"
)
type Boxes struct {
Length []float64
}
type Bottles struct {
Diameter []float64
}
type Delivery struct {
Boxes Boxes
Bottles Bottles
}
var Box_xml = []byte("<Delivery><Boxes><Length>45</Length><Length>41</Length></Boxes></Delivery>")
var Bottle_xml = []byte("<Delivery><Bottles><Diameter>23</Diameter><Diameter>25</Diameter></Bottles></Delivery>")
func main() {
delivery := Delivery{}
xml.Unmarshal(Box_xml, &delivery)
fmt.Println(delivery )
delivery = Delivery{}
xml.Unmarshal(Bottle_xml, &delivery)
fmt.Println(delivery)
}
Этот код печатает
{{[45 41]} {[]}}
{{[]} {[23 25]}}
, и это было бы хорошим способом структурирования результата для последующей обработки.
Как я могу это сделать без добавления искусственного тега root в полезную нагрузку?