2013-12-13 58 views
1

我想從蛋白質數據庫(pdb)解組查詢響應。我一直在閱讀Go的XML編碼包,並瞭解如何處理標籤,但我不知道如何處理嵌套標籤。我從下面的代碼得到輸出(cutout);如何在Go中處理嵌套的XML標籤?

<PDBdescription> 
<PDB structureId="4HHB".... 
</PDBdescription> 

如何獲得有關structureId的信息?因爲它似乎連接到PDB-tag內的PDB-tag?

// pdbRequest 
package main 

import (
    "fmt" 
    "net" 
    "encoding/xml" 
    //"strings" 
) 

type PDB struct { 
    id string `xml:"PDBdescription">"PDB structureId"` 
    XMLName xml.Name 
} 

func main() { 
    conn, err := net.Dial("tcp", "www.rcsb.org:http") 
    p := PDB{id:"NONE"} 
    if err != nil { 
     return 
    } 
    fmt.Fprintf(conn, "GET /pdb/rest/describePDB?structureId=4hhb HTTP/1.0\r\n\r\n") 
    status := make([]byte, 10000) 
    conn.Read(status) 
    xml.Unmarshal([]byte(status), &p) 
    fmt.Println(string(status)) 
    fmt.Println(p.id) 
} 

我看到我的問題很相似,這裏的其他問題(投入鏈接引用推出),但鑑於那裏的答案似乎不是我的解決方案,因爲我的標籤是一個有點不同。

+0

XML不談,爲什麼你使用'net.Dial' HTTP請求? – nemo

+1

如果你使你的示例代碼對操場友好,它可能會更容易回答這個問題。不要從URL中獲取數據,而是將一些示例數據放在多行字符串中,並將其傳遞給xml.Unmarshal。然後把整個事情放在play.golang.org上,並添加到你的問題的鏈接。 – MatrixFrog

+0

@nemo。我只是喜歡使用net.Dial來接觸「低級」套接字思想。 – stian

回答

4

您需要在標記struct字段時使用,attr修飾符。例如:

type PDB struct { 
    StructureId string `xml:"structureId,attr"` 
} 

type root struct { 
    Pdb PDB `xml:"PDBdescription>PDB"` 
} 

如果解碼爲root例如,structureId屬性將被解碼成嵌套Pdb.StructureId領域。

不幸的是,您現在無法將鏈接語法與,attr修飾符組合在一起,因此您需要一個嵌套結構。

這裏是一個工作示例:http://play.golang.org/p/VhUBKKLfk4

+0

非常感謝你,詹姆斯。我嘗試了一些沒有解決方案的東西。我會盡快查看。 – stian