go 1.11.2 xml意外EOF

go 1.11.2 xml意外EOF,xml,go,Xml,Go,我想检查提交的xml文件是否是有效的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 st

我想检查提交的xml文件是否是有效的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
    }
}
const EmptyXml=``
func CanParse(xmlData字符串)(bool,错误){
if strings.TrimSpace(xmlData)=“”{
返回false,无
}
类型标记结构{
xml.Name
内容字符串'xml:,innerxml'`
}
类型对象结构{
Items[]标记`xml:,任意“`
}
var o*对象
错误:=xml.Unmarshal([]字节(xmlData),&o)
如果错误!=零{
返回false,错误
}否则{
返回真,无
}
}
不幸的是,我最终犯了一个错误:意外的EOF。 为什么会这样

实际上,这个方法在一个月前就已经奏效了,而golang从那时起就没有更新过,所以我仍然想知道是什么打破了这个方法


这意味着它需要一个结束标记。我最近没有做太多的XML,但是我认为您必须添加结束标记
或添加问号:

我认为XML声明建议无效(例如,由于缺少“verison”属性),尽管我同意结束标记是正确的修复方法。我认为错误是可以的。因为umarshaler需要输入,但如果没有输入,则为错误。关闭一个声明不是一个好主意。我想说这可能会给其他xml程序带来很多问题(到目前为止,它一直在工作,但最后也出现了同样的错误,这让我很困惑。我不需要xml来包含数据,它只需要有效。正如@apxp所建议的,现在显然由我来处理错误,因为对于一些数据,错误已经消失了:这里有一个EOF处理的解决方案:所以xml a没有变化nd没有改变二进制文件,但是改变了行为?错误是正确的,它是无效的XML,因为有一个打开的标记,没有关闭的标记。不正确的行为可能是您所说的过去发生的行为,我从未见过,如果现在没有发生,则无法排除故障。但是空字符串也会导致EOF e错误:我会说这是可以的,因为如果我调用Unmarshal,我希望我可以解组。但是如果我尝试用空字符串执行此操作,则错误是可以的。现在由您优雅地处理该错误,错误数据已消失:……但是测试现在没有任何意义,因为它也会像“公共知识”: