2014-10-06 42 views
0

我有多個測試用例通過,但是這個失敗。我在這裏丟失了什麼導致解碼器錯誤地讀取了我的目標鍵的內容?自定義XML解碼器問題

const respGenericFault1 = `<?xml version='1.0' encoding='UTF-8'?> 
<SOAP-ENV:Envelope 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/1999/XMLSchema"> 
    <SOAP-ENV:Body> 
    <SOAP-ENV:Fault> 
     <faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode> 
     <faultstring xsi:type="xsd:string">Failed to validate</faultstring> 
    </SOAP-ENV:Fault> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>` 

type Fault struct { 
    FaultCode, FaultString string 
} 

func (f Fault) Error() string { 
    return "Fault Code: '" + f.FaultCode + "' FaultString: '" + f.FaultString + "'" 
} 

func ParseFault(b []byte) error { 
    reader := bytes.NewReader(b) 
    d := xml.NewDecoder(reader) 

    var start xml.StartElement 
    fault := Fault{} 
    found := false 

    // iterate through the tokens 
    for { 
     tok, _ := d.Token() 
     if tok == nil { 
      break 
     } 

     // switch on token type 
     switch t := tok.(type) { 
     case xml.StartElement: 
      start = t.Copy() 
      fmt.Println(start.Name.Local) 
     case xml.CharData: 
      key := strings.ToLower(start.Name.Local) 
      // fault was found, capture the values and mark as found 
      if key == "faultcode" { 
       found = true 
       fault.FaultCode = string(t) 
       fmt.Printf("%#v\n", string(t)) 
      } else if key == "faultstring" { 
       found = true 
       fault.FaultString = string(t) 
      } 
     } 
    } 

    if found { 
     return fault 
    } 
    return nil 
} 

func main() { 
    err := ParseFault([]byte(respGenericFault1)) 
    fmt.Printf("%#v\n", err) 
} 

這裏是操場網址:http://play.golang.org/p/7PFPNsmast

回答