2014-07-27 1 views
0

XML을 언 마샬하려는 중입니다. 여기서 XML을 특수한 방식으로 구문 분석하려고합니다. UnmarshalerAttr interface을 사용해 보았지만 제대로 작동하지 않습니다. 다음 코드를 사용하면 'Castle'만 출력됩니다.Golang : 인코딩/xml의 UnmarshalXMLAttr

package main 

import (
    "encoding/xml" 
    "fmt" 
    "strings" 
) 

type Show struct { 
    Title string `xml:"Title,attr"` 
} 

func (s *Show) UnmarshalXMLAttr(attr xml.Attr) error { 
    fmt.Printf("Parsing attribute '%s', with value '%s'", attr.Name.Local, attr.Value) 
    s.Title = strings.ToUpper(attr.Value) 
    return nil 
} 

func main() { 

    b := []byte(`<Series Title="Castle"></Series>`) 

    var show Show 
    xml.Unmarshal(b, &show) 

    fmt.Println(show) 
} 

아이디어가 있습니까?

답변

0

속성 unmarshaler는 쇼가 아닌 제목의 유형이어야합니다. 여기에 고정 된 버전입니다 :

첫째, 우리는 단지 문자열을 문자열을 감싸고

type title string 

이제 우리는 우리의 유형으로 제목 필드를 정의하는 인터페이스를 구현 아닌 '가짜 유형 "을 만들 수 있습니다.

이 지금이 속성

type Show struct { 
    Title title `xml:"Title,attr"` 
} 

그리고 우리의 유형에 대한 사용자 지정 unmashaler에 대한 우리의 unmarshaler를 호출합니다 :

func (s *title) UnmarshalXMLAttr(attr xml.Attr) error { 
    fmt.Printf("Parsing attribute '%s', with value '%s'", attr.Name.Local, attr.Value) 
    *s = title(strings.ToUpper(attr.Value)) 
    return nil 
} 

나머지는 동일하게 유지 :

func main() { 

    b := []byte(`<Series Title="Castle"></Series>`) 

    var show Show 
    xml.Unmarshal(b, &show) 

    fmt.Println(show) 
} 

http://play.golang.org/p/6J4UZ7BeG1

+0

고마워. 나는 그것이 작동하는 방식에 감명을주지 않았지만 질문으로 대답했다. – RckMrkr