XML解析/解组返回任何

问题描述:

我需要从XML的一些值: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> 

我创造一些结构来解读:

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

你想要什么样的价值观? – md2perpe

+0

全部“

+0

只有'

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