代码之家  ›  专栏  ›  技术社区  ›  marketer

go xml unmarshal示例不编译

  •  2
  • marketer  · 技术社区  · 15 年前

    中的XML示例 go docs 被打破了。有人知道怎么做吗?当我编译它时,结果是:

    xmlexample.go:34: cannot use "name" (type string) as type xml.Name in field value
    xmlexample.go:34: cannot use nil as type string in field value
    xmlexample.go:34: too few values in struct initializer
    

    相关代码如下:

    package main
    
    import (
            "bytes"
            "xml"
    )
    
    type Email struct {
            Where string "attr";
            Addr string;
    }
    
    type Result struct {
            XMLName xml.Name "result";
            Name string;
            Phone string;
            Email []Email;
    }
    
    var buf = bytes.NewBufferString ( `
    <result>
            <email where="home">
                    <addr>gre@example.com</addr>
            </email>
            <email where='work'>
                    <addr>gre@work.com</addr>
            </email>
            <name>Grace R. Emlin</name>
            <address>123 Main Street</address>
    </result>`)
    
    
    func main() {
            var result = Result{ "name", "phone", nil }
            xml.Unmarshal ( buf , &result )
            println ( result.Name )
    }
    
    4 回复  |  直到 14 年前
        1
  •  3
  •   peterSO    15 年前

    这个 type Result 定义为:

    type Result struct {
        XMLName xml.Name "result"
        Name    string
        Phone   string
        Email   []Email
    }
    

    这个 type xml.Name ,嵌入 类型结果 ,定义为:

    // A Name represents an XML name (Local) annotated
    // with a name space identifier (Space).
    // In tokens returned by Parser.Token, the Space identifier
    // is given as a canonical URL, not the short prefix used
    // in the document being parsed.
    type Name struct {
        Space, Local string
    }
    

    因此,使用复合文本初始化,使用类似于以下内容之一的内容:

    var result = Result{xml.Name{}, "name", "phone", nil}
    
    var result = Result{xml.Name{"space", "local"}, "name", "phone", nil}
    
    var result = Result{Name: "name", Phone: "phone", Email: nil}
    
        2
  •  3
  •   Evan Shaw    15 年前

    线

    var result = Result{ "name", "phone", nil }
    

    需要成为

    var result = Result{ Name: "name", Phone: "phone", Email: nil }
    

    然后它应该像预期的那样工作。我提交了一个补丁来修复文档,很快就发布了一个版本,所以没有人应该再次遇到这个特定的问题。

        3
  •  1
  •   metacontent    15 年前

    如果您提供xml.name和其他参数,它也可以工作,例如:

    var result = Result{ xml.Name{"", "result"}, "name", "phone", nil }
    
        4
  •  0
  •   user181548    14 年前

    在这里

    var result Result
    

    作品。