XML解析/ Unmarshal不返回任何内容

时间:2017-10-28 20:41:07

标签: xml go xml-parsing unmarshalling

我需要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请求的响应,我不需要所有的标记值。我只能获得特定的标签值吗?或者我是否需要创建所有结构以获取值?

1 个答案:

答案 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)
    }
}

https://play.golang.org/p/Y9u3Q3YrSi