如何在 Go 中解组包含脏 HTML 的 XML

我有一些我想解组的 XML,但它包含我什至不关心的字段中的脏 HTML。我在这里发布了一个例子:http : //play.golang.org/p/caKCAYyXX2


有没有办法告诉解码器跳过或忽略这些错误?我尝试制作文档中描述的非严格解码器,但无法获得任何组合AutoClose或Entity值来使其正常工作。我应该提到这个 XML 来自我无法控制的 3rd 方,并且内容总是可变的,我不确定编译要跳过的静态元素列表是否可行。添加Description到带有xml:"-"标记的结构没有任何区别。


我能够使用 Python 2.7 解析它,所以我希望它可以在 Go 中实现 - 尽管我更喜欢在我的用例中使用 Go :) - 我为此使用了 Google 的 AppEngine,因此解决方案必须是在本机 Go 中而不依赖于外部 C 库。


相关代码:


var XMLData = []byte(`<?xml version="1.0" encoding="UTF-8"?>

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <soapenv:Body>

  <Container>

   <Timestamp>2014-01-15T21:07:07.217Z</Timestamp>

   <Item>

    <Description>

<table  width="100%" border=0 ><tr><td><table width="100%"><tr><td><!-- Begin Description -->

<TABLE cellSpacing=27 cellPadding=0 width="100%"><TBODY><TR><TD vAlign=top><P align=center>

<TABLE cellPadding=15 width="86%" border=1><TBODY><TR><TD><H3><P>

<H2><H2><H2><H2><H2><H2><H2><H2><H2><H2><H2><H2><H><H2><H2>



<IMG SRC=http://www.REMOVED.com/simage/j6x516.jpg>

<BR><BR>

<IMG SRC=http://www.REMOVED.com/simage/j6x517.jpg>


    </Description>

   </Item>

  <Container>

 </soapenv:Body>

</soapenv:Envelope>`)


type Data struct {

    Timestamp string `xml:"Body>Container>Timestamp"`

}


var o Data

decoder := xml.NewDecoder(bytes.NewBuffer(XMLData))

decoder.Strict = false

decoder.AutoClose = xml.HTMLAutoClose

decoder.Entity = xml.HTMLEntity

if err := decoder.Decode(&o); err != nil {

    fmt.Println("Error: ", err)

} else {

    fmt.Println("Timestamp: ", o.Timestamp)

}

结果: Error:  XML syntax error on line 14: expected /> in element


谢谢你。


德玛西亚99
浏览 209回答 3
3回答

噜噜哒

您的解码器代码很好(您实际上可以删除该decoder.AutoClose = xml.HTMLAutoClose行)。问题是img标签在src属性周围没有引号。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go