2014-05-10 3 views
3

Go에서이 XML 응답의 디코딩은 어떻게해야합니까? 나는 내 Answer 구조체에 사용자 정의 UnMarshal 메소드를 빌드하려했지만 많은 행운이 없다. 이 같은 두 번이스케이프 처리 된 XML을 비 정렬 화

<?xml version="1.0"?> 
<GetAssignmentResponse> 
    <Answer>&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt; 
     &lt;QuestionFormAnswers xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionFormAnswers.xsd"&gt; 
     &lt;Answer&gt; 
     &lt;QuestionIdentifier&gt;Q1HasEvents&lt;/QuestionIdentifier&gt; 
     &lt;FreeText&gt;no&lt;/FreeText&gt; 
     &lt;/Answer&gt; 
     &lt;/QuestionFormAnswers&gt; 
    </Answer> 
</GetAssignmentResponse> 

답변

6

디코드를 (try on playground) 대안으로

package main 

import (
    "encoding/xml" 
    "fmt" 
) 

var data = `<?xml version="1.0"?> 
<GetAssignmentResponse> 
    <Answer>&lt;?xml version="1.0" encoding="UTF-8" standalone="no"?&gt; 
     &lt;QuestionFormAnswers xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionFormAnswers.xsd"&gt; 
     &lt;Answer&gt; 
     &lt;QuestionIdentifier&gt;Q1HasEvents&lt;/QuestionIdentifier&gt; 
     &lt;FreeText&gt;no&lt;/FreeText&gt; 
     &lt;/Answer&gt; 
     &lt;/QuestionFormAnswers&gt; 
    </Answer> 
</GetAssignmentResponse>` 

type Response struct { 
    XMLName xml.Name `xml:"GetAssignmentResponse"` 
    Answer string `xml:"Answer"` 
} 

type Answer struct { 
    XMLName xml.Name `xml:"QuestionFormAnswers"` 
    FreeText string `xml:"FreeText"` 
} 

func main() { 
    v := Response{} 
    err := xml.Unmarshal([]byte(data), &v) 
    if err != nil { 
     fmt.Printf("error: %v", err) 
     return 
    } 
    fmt.Printf("Answer = %q\n", v.Answer) 
    a := Answer{} 
    err = xml.Unmarshal([]byte(v.Answer), &a) 
    if err != nil { 
     fmt.Printf("error: %v", err) 
     return 
    } 
    fmt.Printf("Answer = %#v\n", a) 
} 
+0

이 굉장, 나는 몰랐다는 우아 아니다 텍스트는 자동으로 "언 이스케이프"됩니다. – cnicutar

+0

잘 작동합니다. 감사합니다. – hcliff

1

,이 또한 작동하지만

func (l *AssignmentAnswer) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 
    var (
     content string 
     resp QuestionFormAnswers 
    ) 
    if err := d.DecodeElement(&content, &start); err != nil { 
     return err 
    } 
    c := strings.NewReader(html.UnescapeString(content)) 

    dec := xml.NewDecoder(c) 
    if err := dec.Decode(&resp); err != nil{ 
     return err 
    } 

    *l = AssignmentAnswer{resp} 
    return nil 
} 

type QuestionFormAnswers struct{ 
    Answers []Answer `xml:"Answer"` 
} 

type AssignmentAnswer struct{ 
    QuestionFormAnswers QuestionFormAnswers 
} 

type Assignment struct{ 
    AssignmentId  string 
    WorkerId   string 
    HITId   string 
    AssignmentStatus string 
    AutoApprovalTime string 
    AcceptTime  string 
    SubmitTime  string 
    ApprovalTime  string 
    Answers   AssignmentAnswer `xml:"Answer"` 
}