Unmarshal XML-тег, который содержит смешанное содержимое (например, CDATA, другие теги) - PullRequest
3 голосов
/ 25 марта 2019

Попробуйте демонтировать xml-файл, например:

<Element>
    <![CDATA[hello]]>
    <image>some_url_here</image>
    <![CDATA[world]]>
    mixed content here
</Element>

. Внутри тега Element есть разные типы данных, как мне разобрать этот xml в структуру, такую ​​как:

type XMLElement struct {
    XMLName xml.Name `xml:"Element"`
    CDatas []string `....`
    Image string `...`
    PlainText string `...`
}

или любая другая структура, в которой этот xml может быть распакован.

1 Ответ

0 голосов
/ 27 марта 2019

Это решение не очень хорошо, потому что xmlquery сделал элемент CDATA типом узла TEXT, но я посчитал, что это легко и просто, он использует запрос XPath.

package main

import (
    "fmt"
    "strings"

    "github.com/antchfx/xmlquery"
)

func main() {
    s := `<?xml version="1.0" encoding="UTF-8"?><Element>
<![CDATA[hello]]>
<image>some_url_here</image>
<![CDATA[world]]>
</Element>
`
    doc, err := xmlquery.Parse(strings.NewReader(s))
    if err != nil {
        panic(err)
    }
    elem := xmlquery.FindOne(doc, "//Element")
    for n := elem.FirstChild; n != nil; n = n.NextSibling {
        if n.Data == "image" {
            fmt.Printf("image: %s\n", n.InnerText())
        } else if n.Type == xmlquery.TextNode {
            if len(strings.TrimSpace(n.InnerText())) == 0 {
                // skip it because its' empty node
            } else {
                fmt.Printf("cdata: %s\n", n.InnerText())
            }
        }
    }
    // or using query expression
    image := xmlquery.FindOne(doc, "//image")
    fmt.Printf("image: %s\n", image.InnerText())
}

...