Замут на Golang

Распарсить XML на Go

Для парсинга XML в Go используется стандартная библиотека encoding/xml. Вот подробное руководство:

1. Базовый пример парсинга XML

package main import ( "encoding/xml" "fmt" "log" "strings" ) // Структура для представления данных XML type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"name"` Age int `xml:"age"` Email string `xml:"email,omitempty"` } func main() { // Пример XML-данных data := ` Иван Иванов 30 ivan@example.com ` // Декодирование XML в структуру var person Person err := xml.Unmarshal([]byte(data), &person) if err != nil { log.Fatal("Ошибка парсинга XML:", err) } fmt.Printf("%+v\n", person) // Вывод: {XMLName:{Space: Local:person} Name:Иван Иванов Age:30 Email:ivan@example.com} }

2. Парсинг сложных структур XML

type Address struct { City string `xml:"city"` Country string `xml:"country"` } type Employee struct { XMLName xml.Name `xml:"employee"` ID int `xml:"id,attr"` // Атрибут тега Name string `xml:"name"` Position string `xml:"position"` Address Address `xml:"address"` Projects []string `xml:"projects>project"` // Вложенные элементы } func parseComplexXML() { data := ` Алексей Петров Разработчик

МоскваРоссияПроект АПроект Б ` var emp Employee err := xml.Unmarshal([]byte(data), &emp) if err != nil { log.Fatal(err) } fmt.Printf("ID: %d, Name: %s, City: %s\n", emp.ID, emp.Name, emp.Address.City) // Вывод: ID: 123, Name: Алексей Петров, City: Москва }

3. Парсинг XML из файла

func parseFromFile(filename string) { data, err := os.ReadFile(filename) if err != nil { log.Fatal(err) } var person Person err = xml.Unmarshal(data, &person) if err != nil { log.Fatal(err) } fmt.Println(person) }

4. Последовательное чтение большого XML (Streaming)

Для больших файлов используйте xml.Decoder:

func streamParseXML() { data := ` Иван25 Ольга30 ` decoder := xml.NewDecoder(strings.NewReader(data)) for { token, err := decoder.Token() if err != nil { break // Конец файла или ошибка } switch se := token.(type) { case xml.StartElement: if se.Name.Local == "person" { var p Person decoder.DecodeElement(&p, &se) fmt.Println(p) } } } }

5. Генерация XML из структур

func generateXML() { person := Person{ Name: "Мария", Age: 28, Email: "maria@example.ru", } output, err := xml.MarshalIndent(person, "", " ") if err != nil { log.Fatal(err) } fmt.Println(string(output)) /* Вывод: Мария 28 maria@example.ru */ }

Особенности парсинга XML в Go:

  1. Теги структуры:xml:"name" - имя элементаxml:"name,attr" - атрибут элементаxml:",innerxml" - сырой XML содержимогоxml:",chardata" - текстовое содержимое
  2. Обработка пространств имен:goCopyDownloadtype SOAPEnvelope struct { XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"` Body SOAPBody }
  3. Обработка динамических данных:Для сложных случаев можно использовать xml.Unmarshal с map[string]interface{} или json.RawMessage.
  4. Валидация:Go не поддерживает XSD валидацию из коробки, но можно использовать сторонние библиотеки типа libxml2.

Для работы с HTML как XML (XHTML) можно использовать те же методы, но убедитесь, что документ является валидным XML.

Начать дискуссию