Я хочу проверить, является ли отправленный XML-файл действительным или нет, поэтому проверяю, можно ли его проанализировать. Я так делаю:
const EmptyXml = `<?xml xmlns = "http://www.w3.org/1999/xhtml"?>`
func CanParse(xmlData string) (bool, error) {
if strings.TrimSpace(xmlData) == "" {
return false, nil
}
type Tag struct {
XMLName xml.Name
Content string `xml:",innerxml"`
}
type Object struct {
Items []Tag `xml:",any"`
}
var o *Object
err := xml.Unmarshal([]byte(xmlData), &o)
if err != nil {
return false, err
} else {
return true, nil
}
}
К сожалению, я получаю сообщение об ошибке: неожиданный EOF. Почему это?
На самом деле метод действительно работал месяц назад, и с тех пор golang не обновлялся, поэтому я все еще собираюсь выяснить, что сломало метод.
Ошибка правильная, это недопустимый XML, потому что есть открытый тег без закрывающего тега. Неправильным поведением будет поведение, которое, как вы говорите, имело место раньше, чего я никогда не видел, и которое невозможно устранить, если этого не происходит сейчас.
Но пустая строка также вызывает ошибку EOF: play.golang.org/p/xJYLK5xVpr9 Я бы сказал, что это нормально, потому что, если я вызову Unmarshal, я буду ожидать чего-то, что я могу демаршалировать. Но если я попытаюсь сделать это с пустой строкой, это нормально. Теперь ваша задача - изящно обработать эту ошибку.
Хорошо, с данными ошибка исчезла: goplay.space/#fnhN563zJLG
..но сейчас тест не имеет смысла, так как он также передает произвольную строку типа "Lore Ipsum": goplay.space/#MQxLYMEqiJX
Это означает, что он ожидал конечный тег. В последнее время я мало занимался XML, но думаю, вам нужно либо добавить закрывающий </xml>
, либо поставить вопросительные знаки: <?xml xmlns = "http://www.w3.org/1999/xhtml"?>
Я думаю, что предложение объявления XML недействительно (например, из-за отсутствия атрибута version), хотя я согласен, что закрывающий тег является правильным исправлением здесь.
Думаю, с ошибкой все в порядке. Поскольку умаршалер ожидает ввода, но отсутствие ввода является ошибкой. Закрывать декларацию - не лучшая идея. Я бы сказал, что это могло вызвать множество проблем с другими xml-программами.
на самом деле я пробовал ваши предложения, также с <? xml version = "1.0"?> (который наверняка работал до сих пор, но также приводит к той же ошибке, которая меня смущает. Мне не нужен xml чтобы содержать данные, они просто должны быть действительными.
Как бы то ни было, как предложил @apxp, теперь я, очевидно, должен обработать ошибку, потому что с некоторыми данными ошибка исчезла: goplay.space/#fnhN563zJLG
Вот решение с обработкой EOF: goplay.space/#2x1640wtT7_l
Извините, мне пришлось отбросить оптимизм. Оказалось, что тоже проходит сейчас на creap, который даже не xml как "Lore Ipsum": goplay.space/#MQxLYMEqiJX
Итак, никаких изменений XML и двоичных файлов, но изменение поведения?