Go XML-解析HTML中的布尔属性会导致XML验证错误
我有一个带有以下标记的html输出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>
<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)
}