dongpo4197 2017-09-01 20:52
浏览 36
已采纳

从字符串或字节数组GO创建XML解码器

I have a xml decode function in my app and I use xml.NewDecoder(resp.Body) to decode my xml. the NewDecoder functions receives an io.Reader. But the problem is that in my response from the server I receive the first 230 bytes i need to ignore and the remaining bytes are the xml encoded in base64 that I want to decode. Here an example of the response body:

    --RandomCaracteres...
    Content-Type: application/xml; charset=UTF-8; name=response_xml

    <Response success="1"/>
    --RandomCaracteres...
    Content-Type: text/xml; name=report.xml
    Content-Transfer-Encoding: base64
    PE5leHBvc2VSZXBvcnQgdmVyc2lvbj0iMi4wIj4KPHNjYW5zPgo8c2NhbiBpZD0iNDYwMCIgbmFt......

I need to read only the PE5leHBvc2VSZXBv... data. With the following code I can read the xml:

    bodyBytes, _ := ioutil.ReadAll(resp.Body)
    defer resp.Body.Close()
    data, err := base64.StdEncoding.DecodeString(string(bodyBytes)[230:])
    fmt.Println(data)

but I can't call the xml.NewDecoder() function because data is not a io.Reader type. Is there any way to creade a Decode object from a string?

  • 写回答

1条回答 默认 最新

  • donpvtzuux37724 2017-09-01 20:58
    关注

    Yes there is:

    r := strings.NewReader(dataStr)
    

    And likewise for byte arrays:

    r := bytes.NewReader(dataBytes)
    

    Or, using bytes, you can skip the Reader and NewDecoder entirely and just use Unmarshal directly:

    err := xml.Unmarshal(dataBytes, &myobj)
    

    Or with a string, cast and use Unmarshal:

    err := xml.Unmarshal([]byte(dataStr), &myobj)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装
  • ¥40 复杂的限制性的商函数处理