代码之家  ›  专栏  ›  技术社区  ›  user_78361084

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

  •  0
  • user_78361084  · 技术社区  · 6 年前

    我有 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结构中第一个“Title”的注释)会完全忽略粗体项。

    1 回复  |  直到 6 年前
        1
  •  3
  •   tkausl    6 年前

    Docs

    如果XML元素包含字符数据,则该数据为
    结构字段的类型可以是[]byte或string。如果没有

    这其实不是你想要的,你想要的是:

    如果结构具有类型为[]byte的字段或带标记的字符串

    那个领域的元素。其余的规则仍然适用。

    所以,使用 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