如何从xml(包括标签)中提取完整的html?

时间:2018-09-27 03:41:47

标签: xml go

我有the following code

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 :(得分:3)

Docs

  

如果XML元素包含字符数据,则该数据为
  累积在具有标签“,chardata”的第一个结构字段中。的   struct字段的类型可以为[] byte或字符串。如果没有这样的话   字段,字符数据将被丢弃。

这实际上不是您想要的,您正在寻找的是:

  

如果结构的字段类型为[] byte或带有标签的字符串
  “,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