解组包含混合内容的XML标签(例如CDATA,其他标签)

时间:2019-03-25 10:23:23

标签: xml go unmarshalling cdata

尝试解组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 :(得分:0)

此解决方案不是很好,因为xmlqueryCDATA元素设置为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())
}