在Go中使用嵌套XML-RPC解组组。

huangapple go评论124阅读模式
英文:

Unmarshal Group with Nested XML-RPC in Go

问题

我正在使用Webfaction API,并尝试解析它们的响应以获取会话ID(下面的12345abcde...)。

当特定值嵌套在多个字段下(即params>param)时,我如何访问它?

以下是代码,位于http://play.golang.org/p/krG4_fXVka

  1. package main
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. )
  6. type Result struct {
  7. XMLName xml.Name `xml:"methodResponse"`
  8. Values []string `xml:"params>param>value"`
  9. }
  10. func main() {
  11. data := `
  12. <methodResponse>
  13. <params>
  14. <param>
  15. <value><array><data>
  16. <value><string>12345abcde12345abcde12345</string></value>
  17. <value><struct>
  18. <member>
  19. <name>username</name>
  20. <value><string>trex</string></value>
  21. </member>
  22. <member>
  23. <name>home</name>
  24. <value><string>/home</string></value>
  25. </member>
  26. <member>
  27. <name>mail_server</name>
  28. <value><string>Mailbox1</string></value>
  29. </member>
  30. <member>
  31. <name>web_server</name>
  32. <value><string>Web12</string></value>
  33. </member>
  34. <member>
  35. <name>id</name>
  36. <value><int>1234</int></value>
  37. </member>
  38. </struct></value>
  39. </data></array></value>
  40. </param>
  41. </params>
  42. </methodResponse>`
  43. v := Result{}
  44. err := xml.Unmarshal([]byte(data), &v)
  45. if err != nil {
  46. fmt.Printf("error: %v", err)
  47. return
  48. }
  49. fmt.Printf("XMLName: %#v\n", v.XMLName)
  50. fmt.Printf("Values: %#v\n", v.Values)
  51. }
英文:

I'm using Webfaction API and trying to unmarshal their response to obtain the session ID (12345abcde... below).

How do I access the specific value when its nested under several fields (namely, params>param)?

Code below is at http://play.golang.org/p/krG4_fXVka

  1. package main
  2. import (&quot;encoding/xml&quot;
  3. &quot;fmt&quot;
  4. )
  5. type Result struct {
  6. XMLName xml.Name `xml:&quot;methodResponse&quot;`
  7. Values []string `xml:&quot;params&gt;param&gt;value&quot;`
  8. }
  9. func main() {
  10. data := `
  11. &lt;methodResponse&gt;
  12. &lt;params&gt;
  13. &lt;param&gt;
  14. &lt;value&gt;&lt;array&gt;&lt;data&gt;
  15. &lt;value&gt;&lt;string&gt;12345abcde12345abcde12345&lt;/string&gt;&lt;/value&gt;
  16. &lt;value&gt;&lt;struct&gt;
  17. &lt;member&gt;
  18. &lt;name&gt;username&lt;/name&gt;
  19. &lt;value&gt;&lt;string&gt;trex&lt;/string&gt;&lt;/value&gt;
  20. &lt;/member&gt;
  21. &lt;member&gt;
  22. &lt;name&gt;home&lt;/name&gt;
  23. &lt;value&gt;&lt;string&gt;/home&lt;/string&gt;&lt;/value&gt;
  24. &lt;/member&gt;
  25. &lt;member&gt;
  26. &lt;name&gt;mail_server&lt;/name&gt;
  27. &lt;value&gt;&lt;string&gt;Mailbox1&lt;/string&gt;&lt;/value&gt;
  28. &lt;/member&gt;
  29. &lt;member&gt;
  30. &lt;name&gt;web_server&lt;/name&gt;
  31. &lt;value&gt;&lt;string&gt;Web12&lt;/string&gt;&lt;/value&gt;
  32. &lt;/member&gt;
  33. &lt;member&gt;
  34. &lt;name&gt;id&lt;/name&gt;
  35. &lt;value&gt;&lt;int&gt;1234&lt;/int&gt;&lt;/value&gt;
  36. &lt;/member&gt;
  37. &lt;/struct&gt;&lt;/value&gt;
  38. &lt;/data&gt;&lt;/array&gt;&lt;/value&gt;
  39. &lt;/param&gt;
  40. &lt;/params&gt;

</methodResponse>`

  1. v := Result{}
  2. err := xml.Unmarshal([]byte(data), &amp;v)
  3. if err != nil {
  4. fmt.Printf(&quot;error: %v&quot;, err)
  5. return
  6. }
  7. fmt.Printf(&quot;XMLName: %#v\n&quot;, v.XMLName)
  8. fmt.Printf(&quot;Values: %#v\n&quot;, v.Values)
  9. }

答案1

得分: 5

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通过一个漂亮的打印机,以便以缩进的方式格式化它。

英文:

Not 100% clear on what you're trying to do, but this seems to break it down better?

  1. type Member struct {
  2. Name string `xml:&quot;name&quot;`
  3. Value string `xml:&quot;value&gt;string&quot;`
  4. }
  5. type Result struct {
  6. XMLName xml.Name `xml:&quot;methodResponse&quot;`
  7. FirstValue string `xml:&quot;params&gt;param&gt;value&gt;array&gt;data&gt;value&gt;string&quot;`
  8. Members []Member `xml:&quot;params&gt;param&gt;value&gt;array&gt;data&gt;value&gt;struct&gt;member&quot;`
  9. }

Note that the structure your parsing has a fairly insane level of depth. Might help to run the XML through a pretty printer that formats it for you with indent to see.

huangapple
  • 本文由 发表于 2012年9月17日 08:33:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/12451898.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定