为什么Go';s encoding/xml.Decoder.Token()不能像它应该的那样生成xml.Attr令牌吗?
使用encoding/xml.Decoder,我试图手动解析从中加载的xml文件 出于测试目的,我只是对文档进行迭代,打印出遇到的任何令牌类型:为什么Go';s encoding/xml.Decoder.Token()不能像它应该的那样生成xml.Attr令牌吗?,xml,xml-parsing,xsd,go,xml-attribute,Xml,Xml Parsing,Xsd,Go,Xml Attribute,使用encoding/xml.Decoder,我试图手动解析从中加载的xml文件 出于测试目的,我只是对文档进行迭代,打印出遇到的任何令牌类型: func Test (r io.Reader) { var t xml.Token var pa *xml.Attr var a xml.Attr var co xml.Comment var cd xml.CharData var se xml.StartElement var pi xml.P
func Test (r io.Reader) {
var t xml.Token
var pa *xml.Attr
var a xml.Attr
var co xml.Comment
var cd xml.CharData
var se xml.StartElement
var pi xml.ProcInst
var ee xml.EndElement
var is bool
var xd = xml.NewDecoder(r)
for i := 0; i < 24; i++ {
if t, err = xd.Token(); (err == nil) && (t != nil) {
if a, is = t.(xml.Attr); is { print("ATTR\t"); println(a.Name.Local) }
if pa, is = t.(*xml.Attr); is { print("*ATTR\t"); println(pa) }
if co, is = t.(xml.Comment); is { print("COMNT\t"); println(co) }
if cd, is = t.(xml.CharData); is { print("CDATA\t"); println(cd) }
if pi, is = t.(xml.ProcInst); is { print("PROCI\t"); println(pi.Target) }
if se, is = t.(xml.StartElement); is { print("START\t"); println(se.Name.Local) }
if ee, is = t.(xml.EndElement); is { print("END\t\t"); println(ee.Name.Local) }
}
}
}
请注意,即使到最后一行(第24行),许多属性已在根xs:schema元素以及xs:import和xs:element元素中传递,也不会输出ATTR或*ATTR行
这是Windows 7 64位下的Go 1.0.3 64位。我是做错了什么,还是应该提交Go软件包错误报告
[旁注:在对正确准备的结构执行正常的xml.Unmarshal时,xml包捕获并映射了已知的命名和映射属性。但是,我还需要在根元素中收集“未知”属性(收集此用例的命名空间信息,该用例为),因此我尝试使用解码器.Token()]是的,这是预期的行为。属性被解析,但是 未作为xml.Token返回。属性不只是标记。 见: 属性可以通过中的Attr字段访问 象征性的StartElement。 见: ((一些一般提示: a) 不要使用print或println b) a,ok:=t.(SomeType)习惯用法a称为“逗号ok”,因为布尔值通常命名为“ok”,而不是“is”。请遵守这些惯例 c) 习惯用语应该是
switch t := t.(type) {
case xml.StartElement: ...
case xml.EndElement: ...
}
而不是您的“if a,is=t.(xml.Attr)…”列表
d) 所有这些“var se xml.StartElement”都是噪音(混乱)。使用
这将使您的代码更具可读性。)) 是的,这种行为是意料之中的。属性被解析,但是 未作为xml.Token返回。属性不只是标记。 见: 属性可以通过中的Attr字段访问 象征性的StartElement。 见: ((一些一般提示: a) 不要使用print或println b) a,ok:=t.(SomeType)习惯用法a称为“逗号ok”,因为布尔值通常命名为“ok”,而不是“is”。请遵守这些惯例 c) 习惯用语应该是
switch t := t.(type) {
case xml.StartElement: ...
case xml.EndElement: ...
}
而不是您的“if a,is=t.(xml.Attr)…”列表
d) 所有这些“var se xml.StartElement”都是噪音(混乱)。使用
这将使您的代码更具可读性。)) 在任何情况下是否设置了错误?在任何情况下是否设置了错误?谢谢,这充分解释了我的问题!至于惯用的注释,这是一个快速的、肮脏的一次性“虚拟测试程序”,所以是的,我没有针对各种非编译器强制的、因此完全可选的、完全自以为是的风格指南和非规范进行全面审查。我的意思是,无论如何,我不是在为谷歌公司编码……谢谢,这充分解释了我的问题!至于惯用的注释,这是一个快速的、肮脏的一次性“虚拟测试程序”,所以是的,我没有针对各种非编译器强制的、因此完全可选的、完全自以为是的风格指南和非规范进行全面审查。我的意思是,我不是在为谷歌公司编码。。。
if se, ok := t.(xml.StartElement); ok { ... }