为了账号安全,请及时绑定邮箱和手机立即绑定

Go XML - 解析 HTML 中的布尔属性会导致 XML 验证错误

Go XML - 解析 HTML 中的布尔属性会导致 XML 验证错误

Go
温温酱 2021-11-29 17:01:38
我有一个带有以下标签的 html 输出。<hr noshade>我的结构是type Hr struct {    TagName xml.Name `xml:"hr"`}当我尝试使用“encoding/xml”传递 html 时,它会抛出一个错误,指出该属性没有'='字符。我已经看到抛出此错误是因为默认解码器将 XMLStrict设置为 true。如何忽略这一点并继续解析文档(使用xml.Unmarshal())?编辑:包括 XML 和使用的结构。我发现了解码器设置,并使用了 NewDecoder,但似乎解组没有正确发生。<html><head><title>Some title</title></head><body> <h2>Title here</h2> <ul>  <li><a href="../">..</a></li>  <li><a href="file1.txt">file1.txt</a></li>  <li><a href="file2.zip">file2.zip</a></li>  ..... </ul> <hr noshade><em>Powered by <a href="http://subversion.apache.org/">Apache Subversion</a> version 1.7.18 (r1615261).</em></body></html>到目前为止我写的代码type Anchor struct {    TagName xml.Name `xml:"a"`    Href    string   `xml:"href,attr"`}type ListEntry struct {    TagName  xml.Name `xml:"li"`    Filename Anchor}type DirList struct {    XMLName xml.Name `xml:"ul"`    Entries []ListEntry}type Header struct {    TagName xml.Name `xml:"h2"`}type Head struct {    TagName xml.Name `xml:"head"`    title   Title}type Title struct {    TagName xml.Name `xml:"title"`}type html struct {    TagName xml.Name `xml:"html"`    body    Body     `xml:"body"`    head    Head}type Body struct {    H2            Header    DirectoryList DirList    hr            Hr    em            Em}type Hr struct {    TagName xml.Name `xml:"hr"`}type Em struct {    TagName xml.Name `xml:"em"`    link    Anchor}   contents := retrieveFromWeb()    htmlTag := html{}    decoder := xml.NewDecoder(strings.NewReader(contents))    decoder.Strict = false    decoder.AutoClose = xml.HTMLAutoClose    decoder.Entity = xml.HTMLEntity    err = decoder.Decode(&htmlTag)    fmt.Println("DirList: ", htmlTag)电流输出DirList:  {{ } {{{ }} {{ } []} {{ }} {{ } {{ } }}} {{ } {{ }}}}
查看完整描述

2 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

您可以使用解码器来解组。使用解码器,您可以关闭严格解析并克服您面临的错误。由于您只放置了一行 xml/html 进行解析,因此我假设根元素和 hr 标记之间的某些值和下面的值是示例实现


package main


import (

    "encoding/xml"

    "fmt"

    "strings"

)


type Hr struct {

    XMLName xml.Name `xml:"a"`

    TagName string   `xml:"hr"`

}


func main() {   

    s := "<a><hr noshade>value</hr></a>"


    hr := &Hr{}

    d := xml.NewDecoder(strings.NewReader(s))

    d.Strict = false

    err := d.Decode(hr)

    if err != nil {

        panic(err)

    }


    fmt.Println(hr.TagName)

}

fmt.Println(hr.TagName) 将打印“值”


查看完整回答
反对 回复 2021-11-29
?
慕斯709654

TA贡献1840条经验 获得超5个赞

您的代码中有很多错误:

  • 如果属性不是公开的,则不能被另一个包访问(xml在这种情况下):将所有属性设为大写。

  • li 缺少标签名称。

看到这个工作代码

http://play.golang.org/p/rkNf2OfvdM

package main


import (

    "encoding/xml"

    "fmt"

    "log"

    "strings"

)


type Anchor struct {

    XMLName xml.Name `xml:"a"`

    Href    string   `xml:"href,attr"`

}


type ListEntry struct {

    XMLName xml.Name `xml:"li"`

        Filename Anchor

}


type DirList struct {

    XMLName xml.Name    `xml:"ul"`

    Entries []ListEntry `xml:"li"`

}


type Header struct {

    XMLName xml.Name `xml:"h2"`

}


type Head struct {

    XMLName xml.Name `xml:"head"`

    Title   Title

}


type Title struct {

    XMLName xml.Name `xml:"title"`

}


type Html struct {

    XMLName xml.Name `xml:"html"`

    Body    Body     `xml:"body"`

    Head    Head

}


type Body struct {

    H2            Header

    DirectoryList DirList

    Hr            Hr

    Em            Em

}


type Hr struct {

    XMLName xml.Name `xml:"hr"`

}


type Em struct {

    XMLName xml.Name `xml:"em"`

    link    Anchor

}


var contents = `<html><head><title>Some title</title></head>

<body>

 <h2>Title here</h2>

 <ul>

  <li><a href="../">..</a></li>

  <li><a href="file1.txt">file1.txt</a></li>

  <li><a href="file2.zip">file2.zip</a></li>

 </ul>

 <hr noshade><em>Powered by <a href="http://subversion.apache.org/">Apache Subversion</a> version 1.7.18 (r1615261).</em>

</body></html>`


func main() {

    htmlTag := Html{}

    decoder := xml.NewDecoder(strings.NewReader(contents))

    decoder.Strict = false

    decoder.AutoClose = xml.HTMLAutoClose

    decoder.Entity = xml.HTMLEntity


    err := decoder.Decode(&htmlTag)

    if err != nil {

        log.Fatal(err)

    }


    fmt.Printf("DirList: %v %#[1]v\n", htmlTag)

}


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信