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

Go XML-解析HTML中的布尔属性会导致XML验证错误,xml,parsing,go,Xml,Parsing,Go,我有一个带有以下标记的html输出 <hr noshade> 当我尝试使用“encoding/xml”传递html时,它抛出一个错误,表示该属性没有'='字符 我已经看到抛出此错误是因为默认解码器在Strict设置为true时计算XML 我如何忽略这一点并继续解析文档(使用xml.Unmarshal()) 编辑:包括使用的XML和结构 我找到了解码器设置,并使用了NewDecoder,但是似乎解组没有正确发生 <html><head><title>

我有一个带有以下标记的html输出

<hr noshade>
当我尝试使用“encoding/xml”传递html时,它抛出一个错误,表示该属性没有
'='
字符

我已经看到抛出此错误是因为默认解码器在
Strict
设置为true时计算XML

我如何忽略这一点并继续解析文档(使用
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>
电流输出

DirList:  {{ } {{{ }} {{ } []} {{ }} {{ } {{ } }}} {{ } {{ }}}}

您可以使用解码器来解组。使用解码器,您可以关闭严格的解析并克服所面临的错误。因为您只放了一行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)
}
主程序包
进口(
“编码/xml”
“fmt”
“字符串”
)
类型Hr结构{
XMLName xml.Name`xml:“a”`
标记名字符串`xml:“hr”`
}
func main(){
s:=“
值” hr:=&hr{} d:=xml.NewDecoder(strings.NewReader) d、 严格=错误 错误:=d.Decode(hr) 如果错误!=零{ 恐慌(错误) } fmt.Println(hr.TagName) }

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

您的代码中有许多错误:

  • 如果该属性不是公共的,则其他包无法访问它(在本例中为
    xml
    ):将所有属性设置为大写
  • 李丢失了标签名
请参阅此工作代码

主程序包
进口(
“编码/xml”
“fmt”
“日志”
“字符串”
)
类型锚结构{
XMLName xml.Name`xml:“a”`
Href字符串`xml:“Href,attr”`
}
类型ListEntry结构{
XMLName xml.Name`xml:“li”`
文件名锚
}
类型DirList结构{
XMLName xml.Name`xml:“ul”`
条目[]ListEntry`xml:“li”`
}
类型头结构{
XMLName xml.Name`xml:“h2”`
}
类型头结构{
XMLName xml.Name`xml:“头”`
头衔
}
类型标题结构{
XMLName xml.Name`xml:“title”`
}
键入Html结构{
XMLName xml.Name`xml:“html”`
Body`xml:“Body”`
头
}
类型体结构{
H2集管
目录列表目录列表
人力资源
嗯嗯
}
类型Hr结构{
XMLName xml.Name`xml:“hr”`
}
类型Em struct{
XMLName xml.Name`xml:“em”`
链锚
}
var contents=`一些标题
标题在这里

由版本1.7.18(r1615261)供电。 ` func main(){ htmlTag:=Html{} 解码器:=xml.NewDecoder(strings.NewReader(contents)) decoder.Strict=false decoder.AutoClose=xml.HTMLAutoClose decoder.Entity=xml.HTMLEntity 错误:=解码器。解码(&htmlTag) 如果错误!=零{ log.Fatal(错误) } fmt.Printf(“目录:%v%#[1]v\n”,htmlTag) }
谢谢!我已经添加了到目前为止我编写的代码和HTML格式。但是我没有得到任何输出。
DirList:  {{ } {{{ }} {{ } []} {{ }} {{ } {{ } }}} {{ } {{ }}}}
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)
}
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)
}