2015-04-07 2 views
2

У меня есть большое количество 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, так как большинство файлов правильно отформатирован.

+0

Рассмотрите предварительную обработку ваших XML-файлов, чтобы исправить их, прежде чем передавать их в вашу программу. Если они все порождаются подобным образом, то их довольно легко исправить. Общая проблема заключается в том, что синтаксический анализатор XML не может точно знать, каким образом * документ экземпляра искажен, поэтому он не может догадываться о том, как интерпретировать его свободно (как вы его ожидаете). – maerics

+0

См. ['Decoder.AutoClose'] (https://godoc.org/pkg/encoding/xml/#Decoder). –

+0

Боковое примечание (хотя это может быть только в вашем упрощенном примере): не читайте читателя из 'string' через' bytes.NewReader ([] byte (stringVar)) '; вместо этого используйте ['strings.NewReader (stringVar)'] (https://golang.org/pkg/strings/#NewReader). –

ответ

-1

Ничего подобного. Вам нужен собственный декодер: http://play.golang.org/p/Kr7nq64f-c

+0

Я не упоминал, что этот пример не будет работать для всех примеров. Вам нужно будет настроить его, если у вас есть дополнительные вложенные элементы. – kwolfe

+1

(a) Вы отвечаете не совсем так (например, 'AutoClose', если набор таких тегов известен), но что более важно (b) ссылка только ответы не рекомендуются на SE, вы должны включить хотя бы ядро ​​того, что вы ссылку непосредственно на ответ и (c) ваш комментарий, вероятно, должен был быть отредактирован для ответа. –

2

Ниже работало для меня, что, вероятно, идеально подходит, если вы знаете проблематичные теги. Хотя, как ни странно, это не работает, если я также добавляю имя.

dec.AutoClose = append(dec.AutoClose, "last-name") 
dec.AutoClose = append(dec.AutoClose, "id") 
Смежные вопросы