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

解组包含混合内容的XML标记(例如CDATA、其他标记),xml,go,unmarshalling,cdata,Xml,Go,Unmarshalling,Cdata,尝试解组xml文件,如: <Element> <![CDATA[hello]]> <image>some_url_here</image> <![CDATA[world]]> mixed content here </Element> 这个解决方案不是很好,因为它将CDATA元素作为文本节点类型,但我认为它很简单,使用XPath查询 主程序包 进口( “fmt” “字符串” “github.

尝试解组xml文件,如:

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

这个解决方案不是很好,因为它将
CDATA
元素作为文本节点类型,但我认为它很简单,使用
XPath
查询

主程序包
进口(
“fmt”
“字符串”
“github.com/antchfx/xmlquery”
)
func main(){
s:=`
这里有一些
`
doc,err:=xmlquery.Parse(strings.NewReader)
如果错误!=零{
恐慌(错误)
}
elem:=xmlquery.FindOne(doc,//Element)
对于n:=elem.FirstChild;n!=nil;n=n.NextSibling{
如果n.数据==“图像”{
fmt.Printf(“图像:%s\n”,n.InnerText())
}如果n.Type==xmlquery.TextNode,则为else{
如果len(strings.TrimSpace(n.InnerText())==0{
//跳过它,因为它的“空节点”
}否则{
fmt.Printf(“cdata:%s\n”,n.InnerText())
}
}
}
//或者使用查询表达式
image:=xmlquery.FindOne(doc,//image)
fmt.Printf(“图像:%s\n”,image.InnerText())
}

@SignatureD
cdata
必须是
字符串
[]字节
,然后使用阿卜杜拉评论中提到的
cdata
标记选项。您可以让您的类型实现
编码.TextUnmarshaler
接口,然后您的类型将被调用一次,其中包含单独CDATA部分中的所有内容,这意味着您必须自己解析该内容,然后将其放入片段中。。。。要将所有内容解码为单个列表,不仅是cdata,还包括普通元素,您必须实现
xml.Unmarshaler
接口,它比
textumarshaler
要复杂一些,但它确实是可行的,您可以在github上查找示例代码:这是因为解组xml总是以有效的xml元素开始,所以您需要为封闭类型实现它,然后在解码器的令牌上循环。我马上就来举一个不完整的例子。。。。在这里:
type XMLElement struct {
    XMLName xml.Name `xml:"Element"`
    CDatas []string `....`
    Image string `...`
    PlainText string `...`
}