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, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»