Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Go';s encoding/xml.Decoder.Token()不能像它应该的那样生成xml.Attr令牌吗?_Xml_Xml Parsing_Xsd_Go_Xml Attribute - Fatal编程技术网

为什么Go';s encoding/xml.Decoder.Token()不能像它应该的那样生成xml.Attr令牌吗?

为什么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

使用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.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:importxs: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 { ... }