我需要xml中的一些值:
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:consultaPontoResponse
xmlns:ns2="http://ws.consultaponto.senior.com/">
<return>
<clock>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>9</hour>
<minute>14</minute>
</time>
</clock>
<clock>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>11</hour>
<minute>51</minute>
</time>
</clock>
<clock>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>12</hour>
<minute>4</minute>
</time>
</clock>
<clock>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>12</hour>
<minute>27</minute>
</time>
</clock>
<workedTime>
<hour>3</hour>
<minute>0</minute>
</workedTime>
<currentDateTime>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>13</hour>
<minute>16</minute>
</time>
</currentDateTime>
</return>
</ns2:consultaPontoResponse>
</S:Body>
</S:Envelope>
我为unmarshall创建了一些结构:
type Envelope struct {
Body Body
}
type Body struct {
Consulta Consulta `xml: "consultaPontoResponse"`
}
type Consulta struct {
Return Return
}
type Clock struct {
Time Time
}
type Return struct {
Clock []Clock
}
type Time struct {
Hour string
Minute string
}
所以我在使用时不会收到任何东西:
xmlEnvelope := &Envelope{}
xml.Unmarshal(sonataXml, xmlEnvelope)
xml.Unmarshal(sonataXml, xmlEnvelope)
的返回是一个空对象。这个xml是SOAP请求的响应,我不需要所有的标记值。我只能获得特定的标签值吗?或者我是否需要创建所有结构以获取值?
答案 0 :(得分:2)
package main
import (
"encoding/xml"
"fmt"
)
var data string = `<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:consultaPontoResponse
xmlns:ns2="http://ws.consultaponto.senior.com/">
<return>
<clock>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>9</hour>
<minute>14</minute>
</time>
</clock>
<clock>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>11</hour>
<minute>51</minute>
</time>
</clock>
<clock>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>12</hour>
<minute>4</minute>
</time>
</clock>
<clock>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>12</hour>
<minute>27</minute>
</time>
</clock>
<workedTime>
<hour>3</hour>
<minute>0</minute>
</workedTime>
<currentDateTime>
<date>
<day>28</day>
<month>10</month>
<year>2017</year>
</date>
<time>
<hour>13</hour>
<minute>16</minute>
</time>
</currentDateTime>
</return>
</ns2:consultaPontoResponse>
</S:Body>
</S:Envelope>`
type Time struct {
Hour int `xml:"hour"`
Minute int `xml:"minute"`
}
func (t Time) String() string {
return fmt.Sprintf("%02d:%02d", t.Hour, t.Minute)
}
type Return struct {
Times []Time `xml:"Body>consultaPontoResponse>return>clock>time"`
}
func main() {
var r Return
err := xml.Unmarshal([]byte(data), &r)
if err != nil {
panic(err)
}
fmt.Println("Times:")
for _, t := range r.Times {
fmt.Println("*", t)
}
}