2016-12-14 10 views
2

time.Parse()を単純な値で実行すると、すべて正常ですが、XMLを解析することはできません。XMLからの解析日が正しく動作しない

type customDate struct { 
    time.Time 
} 


func (c *customDate) UnmarshalXml(d *xml.Decoder, start xml.StartElement) error { 
    var v string 
    if err := d.DecodeElement(&v, &start); err != nil{ 
     return err 
    } 

    loc, _ := time.LoadLocation("Europe/Moscow") 
    prs, err := time.ParseInLocation("02.01.2006", v, loc) 
    if err != nil { 
     return err 
    } 

    *c = customDate{prs} 
    return nil 
} 

example on playground

答えて

2

date XML属性、ない要素です。おかげ

package main 

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

type xmlSource struct { 
    XMLName xml.Name `xml:"BicDBList"` 
    Base string `xml:"Base,attr"` 
    Items []item `xml:"item"` 
} 

// Item represent structure of node "item" 
type item struct { 
    File string  `xml:"file,attr"` 
    Date customDate `xml:"date,attr"` 
} 

type customDate struct { 
    time.Time 
} 

func (c *customDate) UnmarshalXMLAttr(attr xml.Attr) error { 
    loc, err := time.LoadLocation("Europe/Moscow") 
    if err != nil { 
     return err 
    } 
    prs, err := time.ParseInLocation("02.01.2006", attr.Value, loc) 
    if err != nil { 
     return err 
    } 

    c.Time = prs 
    return nil 
} 

var data = []byte(`<BicDBList Base="/mcirabis/BIK/"> 
    <item file="bik_db_09122016.zip" date="09.12.2016"/> 
    <item file="bik_db_08122016.zip" date="08.12.2016"/> 
    <item file="bik_db_07122016.zip" date="07.12.2016"/> 
    <item file="bik_db_06122016.zip" date="06.12.2016"/> 
</BicDBList>`) 

func main() { 
    var sample xmlSource 

    err := xml.Unmarshal(data, &sample) 

    if err != nil { 
     println(err.Error()) 
    } 
    fmt.Printf("%#v\n", sample) 
} 

https://play.golang.org/p/U56qfEOe-A

+0

++++++++:したがって、あなたはxml.UnmarshalerAttrインターフェイスではなく、xml.Unmarshalerを実装する必要があります。 – user2782106

関連する問題