猿问

自定义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


米琪卡哇伊
浏览 153回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答