Используйте xml.Encoder
для потоковой передачи выходных данных XML на io.Writer
, который может быть сетевым подключением (net.Conn
) или файлом (os.File
).Полный результат не будет сохранен в памяти.
Вы можете использовать Encoder.Encode()
для кодирования значения Go в XML.Как правило, вы можете передать любое значение Go, которое вы передадите xml.Marshal()
.
Encoder.Encode()
, только в том случае, если данные, которые вы хотите собрать, готовы в памяти, что можетне выполнимо для вас.Например, если вы хотите упорядочить большой список, который не может (или не должен) считываться в память, это не станет для вас спасением.
Если входные данные также не могут храниться в памяти, вы можетепостроить вывод XML по токенам и элементам.Для этого вы можете использовать Encoder.EncodeToken()
, что позволяет записывать «части» результирующего XML-документа.
Например, если вы хотите записать большой вывод в вывод, вы можетенаписать тег начального элемента (например, <list>
), затем записать элементы списка один за другим (каждый выбирается из базы данных или из файла, или создается алгоритмом на лету), и как только список становитсяmarshaled, вы можете закрыть тег элемента списка (</list>
).
Вот простой пример того, как вы можете это сделать:
type Student struct {
ID int
Name string
}
func main() {
he := func(err error) {
if err != nil {
panic(err) // In your app, handle error properly
}
}
// For demo purposes we use an in-memory buffer,
// but this may be an os.File too.
buf := &bytes.Buffer{}
enc := xml.NewEncoder(buf)
enc.Indent("", " ")
he(enc.EncodeToken(xml.StartElement{Name: xml.Name{Local: "list"}}))
for i := 0; i < 3; i++ {
// Here you can fetch / construct the records
he(enc.Encode(Student{ID: i, Name: string(i + 'A')}))
}
he(enc.EncodeToken(xml.EndElement{Name: xml.Name{Local: "list"}}))
he(enc.Flush())
fmt.Println(buf.String())
}
Вывод вышеприведенного (попробуйте его на Игровая площадка Go ):
<list>
<Student>
<ID>0</ID>
<Name>A</Name>
</Student>
<Student>
<ID>1</ID>
<Name>B</Name>
</Student>
<Student>
<ID>2</ID>
<Name>C</Name>
</Student>
</list>