Как извлечь полный HTML из XML (включая теги)? - PullRequest
0 голосов
/ 27 сентября 2018

У меня следующий код :

package main

import (
    "encoding/xml"
    "fmt"
)

func main() {
    xr := &xmlResponse{}

    if err := xml.Unmarshal([]byte(x), &xr); err != nil {
        panic(err)
    }

    fmt.Printf("%+v", xr)
}

type xmlResponse struct {
    //Title string `xml:"title,omitempty"`
    Title struct {
        BoldWords []struct {
            Bold string `xml:",chardata"`
        } `xml:"bold,omitempty"`
        Title string `xml:",chardata" `
    } `xml:"title,omitempty"`
}

var x = `<?xml version="1.0" encoding="utf-8"?>
<mytag version="1.0">
  <title><bold>Go</bold> is a programming language. I repeat: <bold>Go</bold> is a programming language.</title>
</mytag>`

Это выводит:

&{Title:{BoldWords:[{Bold:Go} {Bold:Go}] Title: is a programming language. I repeat:  is a programming language.}}

Как мне получить:

<bold>Go</bold> is a programming language. I repeat: <bold>Go</bold> is a programming language.

Другими словами, мне нужны не только метки, но и их правильное место, а не просто кусок выделенных элементов.Попытка получить его просто как строку (например, раскомментировать первый «Заголовок» в структуре xmlResponse) полностью исключает выделенные жирным шрифтом элементы.

1 Ответ

0 голосов
/ 27 сентября 2018

Из Документов

Если элемент XML содержит символьные данные, эти данные
накапливаются в первом структурном поле с тегом ", chardata".Поле структуры может иметь тип [] байт или строку.Если такого поля нет, символьные данные отбрасываются.

Это на самом деле не то, что вы хотите, то, что вы ищете:

Если структураимеет поле типа [] byte или string с тегом
", innerxml", Unmarshal накапливает необработанный XML, вложенный в элемент
в этом поле.Остальные правила все еще применяются.

Итак, используйте innerxml вместо chardata.

package main

import (
    "encoding/xml"
    "fmt"
)

func main() {
    xr := &xmlResponse{}

    if err := xml.Unmarshal([]byte(x), &xr); err != nil {
        panic(err)
    }

    fmt.Printf("%+v", xr)
}

type xmlResponse struct {
    //Title string `xml:"title,omitempty"`
    Title struct {
        Title string `xml:",innerxml" `
    } `xml:"title,omitempty"`
}

var x = `<?xml version="1.0" encoding="utf-8"?>
<mytag version="1.0">
  <title><bold>Go</bold> is a programming language. I repeat: <bold>Go</bold> is a programming language.</title>
</mytag>`

Выходы:

&{Title:{Title:<bold>Go</bold> is a programming language. I repeat: <bold>Go</bold> is a programming language.}}

Play

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...