英文:
Create a XML Decoder from a string or byte array GO
问题
我在我的应用程序中有一个XML解码函数,并且我使用xml.NewDecoder(resp.Body)来解码我的XML。NewDecoder函数接收一个io.Reader。但问题是,在来自服务器的响应中,我收到了前230个字节,我需要忽略,剩下的字节是我想要解码的以base64编码的XML。以下是响应正文的示例:
--随机字符...
Content-Type: application/xml; charset=UTF-8; name=response_xml
<Response success="1"/>
--随机字符...
Content-Type: text/xml; name=report.xml
Content-Transfer-Encoding: base64
PE5leHBvc2VSZXBvcnQgdmVyc2lvbj0iMi4wIj4KPHNjYW5zPgo8c2NhbiBpZD0iNDYwMCIgbmFt......
我只需要读取PE5leHBvc2VSZXBv...的数据。使用以下代码,我可以读取XML:
bodyBytes, _ := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
data, err := base64.StdEncoding.DecodeString(string(bodyBytes)[230:])
fmt.Println(data)
但是,我无法调用xml.NewDecoder()函数,因为data不是io.Reader类型。有没有办法从字符串创建一个Decode对象?
英文:
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
得分: 3
r := strings.NewReader(dataStr)
r := bytes.NewReader(dataBytes)
或者,使用字节数组,你可以完全跳过Reader
和NewDecoder
,直接使用Unmarshal
:
err := xml.Unmarshal(dataBytes, &myobj)
或者使用string
,进行类型转换并使用Unmarshal
:
err := xml.Unmarshal([]byte(dataStr), &myobj)
英文:
r := strings.NewReader(dataStr)
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)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论