2012-09-17 15 views
2

我正在使用Webfaction API並嘗試解組他們的響應以獲取會話ID(12345abcde ...如下)。在嵌套的XML-RPC中使用解組組合

如何在嵌套在幾個字段(即params> param)時訪問特定值?下面

代碼爲http://play.golang.org/p/krG4_fXVka

package main 

import ("encoding/xml" 
     "fmt" 
     ) 

type Result struct { 
     XMLName xml.Name `xml:"methodResponse"` 
     Values []string `xml:"params>param>value"` 
} 

func main() { 
data := ` 
    <methodResponse> 
<params> 
    <param> 
     <value><array><data> 
      <value><string>12345abcde12345abcde12345</string></value> 
      <value><struct> 
       <member> 
        <name>username</name> 
        <value><string>trex</string></value> 
       </member> 
       <member> 
        <name>home</name> 
        <value><string>/home</string></value> 
       </member> 
       <member> 
        <name>mail_server</name> 
        <value><string>Mailbox1</string></value> 
       </member> 
       <member> 
        <name>web_server</name> 
        <value><string>Web12</string></value> 
       </member> 
       <member> 
        <name>id</name> 
        <value><int>1234</int></value> 
       </member> 
      </struct></value> 
     </data></array></value> 
    </param> 
</params> 

`

v := Result{} 
err := xml.Unmarshal([]byte(data), &v) 
if err != nil { 
fmt.Printf("error: %v", err) 
     return 
} 
fmt.Printf("XMLName: %#v\n", v.XMLName) 
fmt.Printf("Values: %#v\n", v.Values) 

} 

回答

4

不上你想要做什麼100%的清楚,但是這似乎打破它更好?

type Member struct { 
    Name string `xml:"name"` 
    Value string `xml:"value>string"` 
} 

type Result struct { 
     XMLName xml.Name `xml:"methodResponse"` 
     FirstValue string `xml:"params>param>value>array>data>value>string"` 
     Members []Member `xml:"params>param>value>array>data>value>struct>member"` 
} 

請注意,您的解析結構具有相當瘋狂的深度級別。可以通過一個漂亮的打印機來幫助運行XML,該打印機通過縮進來爲您設置格式。

+0

是否存在後處理方法並消除冗餘深度?同意瘋狂的深度將我拋棄 – Lionel

+0

不知道你需要後處理它 - 在你運行它之後,你會得到一個直接的字符串,例如:v.FirstValue ==「12345abcde12345abcde12345」。你必須規定你想要從哪裏捕捉數據的位置......也可以放在xml標籤中。 – oxfl

+0

謝謝,它的工作原理! http://play.golang.org/p/mfXigg32Y2 – Lionel