У меня есть большое количество XML-файлов для синтаксического анализа, которые содержат закрытые теги, завернутые в закрытые теги. Что-то, как показано ниже:Анализ искаженного XML-файла в Go
<submission>
<first-name>Henry
<last-name>Donald
<id>4224
</submission>
Я поставил decoder.Strict = ложь, но она по-прежнему не в состоянии разобрать весь файл XML правильно.
type Submission struct {
FirstName string `xml:"first-name"`
LastName string `xml:"last-name"`
ID string `xml:"id"`
}
func main() {
dec := xml.NewDecoder(bytes.NewReader([]byte(sub)))
dec.Strict = false
dec.AutoClose = xml.HTMLAutoClose
dec.Entity = xml.HTMLEntity
var s Submission
err := dec.Decode(&s)
if err != nil {
fmt.Println(err)
}
fmt.Println(s)
}
площадка: https://play.golang.org/p/-_chEpDhzX
Я знаю, что есть HTML токенизатор, что я могу попробовать использовать, но я предпочел бы использовать пакет XML, так как большинство файлов правильно отформатирован.
Рассмотрите предварительную обработку ваших XML-файлов, чтобы исправить их, прежде чем передавать их в вашу программу. Если они все порождаются подобным образом, то их довольно легко исправить. Общая проблема заключается в том, что синтаксический анализатор XML не может точно знать, каким образом * документ экземпляра искажен, поэтому он не может догадываться о том, как интерпретировать его свободно (как вы его ожидаете). – maerics
См. ['Decoder.AutoClose'] (https://godoc.org/pkg/encoding/xml/#Decoder). –
Боковое примечание (хотя это может быть только в вашем упрощенном примере): не читайте читателя из 'string' через' bytes.NewReader ([] byte (stringVar)) '; вместо этого используйте ['strings.NewReader (stringVar)'] (https://golang.org/pkg/strings/#NewReader). –