Go XML Unmarshal пример не компилируется - PullRequest
2 голосов
/ 06 января 2010

Пример Xml в go документах не работает. Кто-нибудь знает, как заставить это работать? Когда я скомпилирую, результат будет:

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 ]

3 голосов
/ 06 января 2010

type Result определяется как:

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

type xml.Name, встроенный в type Result, определяется как:

// 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}
3 голосов
/ 06 января 2010

Линия

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

должно стать

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

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

1 голос
/ 06 января 2010

Это также работает, если вы предоставляете xml.Name {} вместе с другими аргументами, например:

var result = Result{ xml.Name{"", "result"}, "name", "phone", nil }
0 голосов
/ 22 августа 2010

Здесь

var result Result

работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...