Тип xml.CharData

Тип xml.CharData представляет собой символьные данные (текстовое содержимое) внутри XML-элемента. Он используется при парсинге XML-документов с помощью xml.Decoder. xml.CharData хранит текст между открывающим и закрывающим тегами элемента. В первый аргумент мы передаем байтовый срез с символьными данными, который может быть преобразован в строку для дальнейшей обработки.

Синтаксис

gotype CharData []byte

Пример использования при парсинге XML

Давайте распарсим XML-документ и извлечем символьные данные из элементов:

gopackage main

import (
  "encoding/xml"
  "fmt"
  "strings"
)

func main() {
  xmlData := `<root>
    <name>John</name>
    <age>30</age>
    <city>New York</city>
  </root>`
  
  decoder := xml.NewDecoder(strings.NewReader(xmlData))
  
  for {
    token, err := decoder.Token()
    if err != nil {
      break
    }
    
    switch elem := token.(type) {
    case xml.CharData:
      data := strings.TrimSpace(string(elem))
      if data != "" {
        fmt.Printf("%q\n", data)
      }
    }
  }
}

Результат выполнения кода:

go"John"
"30"
"New York"

Пример преобразования CharData в строку

Давайте преобразуем xml.CharData в строку и выполним с ней различные операции:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

func main() {
  var data xml.CharData = []byte("Hello, World!")
  
  str := string(data)
  fmt.Printf("string: %q\n", str)
  fmt.Printf("length: %d\n", len(str))
  fmt.Printf("bytes: %v\n", []byte(data))
}

Результат выполнения кода:

go"string: \"Hello, World!\""
"length: 13"
"bytes: [72 101 108 108 111 44 32 87 111 114 108 100 33]"

Пример работы с экранированными символами

Давайте обработаем символьные данные, содержащие специальные символы:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

func main() {
  xmlData := `<data><Hello> & "World"</data>`
  
  decoder := xml.NewDecoder(strings.NewReader(xmlData))
  
  for {
    token, err := decoder.Token()
    if err != nil {
      break
    }
    
    switch elem := token.(type) {
    case xml.CharData:
      unescaped := string(elem)
      fmt.Printf("Оригинал: %q\n", unescaped)
    }
  }
}

Результат выполнения кода:

go"Оригинал: \"<Hello> & \"World\"\""

Смотрите также

  • тип xml.Name,
    который представляет имя XML-элемента
  • тип xml.StartElement,
    который представляет открывающий тег элемента
  • тип xml.EndElement,
    который представляет закрывающий тег элемента
  • тип xml.Attr,
    который представляет атрибут XML-элемента