XML является популярным форматом для обмена данными. Go поддерживает библиотеку для парсинга XML файлов. Процесс похож на работу с JSON. Обычно используется структура, что соответствует схеме XML, и с помощью этого сразу проводится парсинг содержимого XML. Проблема возникает, когда XML слишком большой для имеющейся памяти, поэтому нужно обрабатывать файл по кускам. В данной инструкции показано, как работать с крупными XML файлами и собрать требуемую информацию.
Как выполнить парсинг большого XML файла в Golang?
1. Создайте файл data.xml со следующим содержимым XML:
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?xml version="1.0"?> <catalog> <book id="bk101"> <author>Gambardella, Matthew</author> <title>XML Developer's Guide</title> <genre>Computer</genre> <price>44.95</price> <publish_date>2000-10-01</publish_date> <description>An in-depth look at creating applications with XML.</description> </book> <book id="bk112"> <author>Galos, Mike</author> <title>Visual Studio 7: A Comprehensive Guide</title> <genre>Computer</genre> <price>49.95</price> <publish_date>2001-04-16</publish_date> <description>Microsoft Visual Studio 7 is explored in depth, looking at how Visual Basic, Visual C++, C#, and ASP+ are integrated into a comprehensive development environment.</description> </book> </catalog> |
2. Создайте файл xml.go со следующим содержимым:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
package main import ( "encoding/xml" "fmt" "os" ) type Book struct { Title string `xml:"title"` Author string `xml:"author"` } func main() { f, err := os.Open("data.xml") if err != nil { panic(err) } defer f.Close() decoder := xml.NewDecoder(f) // Чтение book по частям books := make([]Book, 0) for { tok, err := decoder.Token() if err != nil { panic(err) } if tok == nil { break } switch tp := tok.(type) { case xml.StartElement: if tp.Name.Local == "book" { // Декодирование элемента в структуру var b Book decoder.DecodeElement(&b, &tp) books = append(books, b) } } } fmt.Println(books) } |
3. Запустите код через go run xml.go;
4. Посмотрите на результат в терминале:

Пакет xml для парсинга XML файлов в Go
С помощью функции NewDecoder из пакета xml создается декодер для содержимого XML файла.
Через вызов метода Token для Decoder мы принимаем xml.Token. xml.Token является интерфейсом, что содержит тип токена. Поведение кода можно определить на основании типа. Код из примера выше проверяет, если парсируемый изначальный элемент xml.StartElement является одним из элементов <book>. Затем производится парсинг данных по частям в структуру Book. В таком случае позиция указателя в базовом Reader в Decoder перемещается через структуру данных, и парсинг может продолжаться.

Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»