Go 1.11.2 xml неожиданный EOF

Я хочу проверить, является ли отправленный 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 не обновлялся, поэтому я все еще собираюсь выяснить, что сломало метод.

https://goplay.space/#YxiyTbq8ww0

Итак, никаких изменений XML и двоичных файлов, но изменение поведения?

apxp 18.12.2018 15:16

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

Adrian 18.12.2018 15:18

Но пустая строка также вызывает ошибку EOF: play.golang.org/p/xJYLK5xVpr9 Я бы сказал, что это нормально, потому что, если я вызову Unmarshal, я буду ожидать чего-то, что я могу демаршалировать. Но если я попытаюсь сделать это с пустой строкой, это нормально. Теперь ваша задача - изящно обработать эту ошибку.

apxp 18.12.2018 15:21

Хорошо, с данными ошибка исчезла: goplay.space/#fnhN563zJLG

Macilias 18.12.2018 15:42

..но сейчас тест не имеет смысла, так как он также передает произвольную строку типа "Lore Ipsum": goplay.space/#MQxLYMEqiJX

Macilias 18.12.2018 16:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
766
1

Ответы 1

Это означает, что он ожидал конечный тег. В последнее время я мало занимался XML, но думаю, вам нужно либо добавить закрывающий </xml>, либо поставить вопросительные знаки: <?xml xmlns = "http://www.w3.org/1999/xhtml"?>

Я думаю, что предложение объявления XML недействительно (например, из-за отсутствия атрибута version), хотя я согласен, что закрывающий тег является правильным исправлением здесь.

Marcin Zawiejski 18.12.2018 15:11

Думаю, с ошибкой все в порядке. Поскольку умаршалер ожидает ввода, но отсутствие ввода является ошибкой. Закрывать декларацию - не лучшая идея. Я бы сказал, что это могло вызвать множество проблем с другими xml-программами.

apxp 18.12.2018 15:23

на самом деле я пробовал ваши предложения, также с <? xml version = "1.0"?> (который наверняка работал до сих пор, но также приводит к той же ошибке, которая меня смущает. Мне не нужен xml чтобы содержать данные, они просто должны быть действительными.

Macilias 18.12.2018 15:36

Как бы то ни было, как предложил @apxp, теперь я, очевидно, должен обработать ошибку, потому что с некоторыми данными ошибка исчезла: goplay.space/#fnhN563zJLG

Macilias 18.12.2018 15:42

Вот решение с обработкой EOF: goplay.space/#2x1640wtT7_l

Macilias 18.12.2018 15:49

Извините, мне пришлось отбросить оптимизм. Оказалось, что тоже проходит сейчас на creap, который даже не xml как "Lore Ipsum": goplay.space/#MQxLYMEqiJX

Macilias 18.12.2018 15:59

Другие вопросы по теме