2015-11-24 24 views
1

假設我有以下xml數據塊。僅使用一種結構類型重組xml,以編組/去編組

<Result> 
     <person> 
      <name>Dave</name> 
     </person> 
     <id> 
      <number>1234</number> 
     </id> 
    </Result> 

我想將其重構爲以下內容。

<Restructured> 
     <Person>Dave</Person> 
     <Id>1234</Id> 
    </Restructured> 

但只使用一個結構來做到這一點。可能嗎?

下面附上代碼。

package main 

import (
    "encoding/xml" 
    "fmt" 
    "os" 
) 

type Result struct { 
    Person string `xml:"person>name"` 
    Id  int `xml:"id>number"` 
} 

type Restructured struct { 
    Person string 
    Id  int 
} 

const data = ` 
<Result> 
    <person> 
     <name>Dave</name> 
    </person> 
    <id> 
     <number>1234</number> 
    </id> 
</Result>` 

func main() { 
    v := Result{} 
    err := xml.Unmarshal([]byte(data), &v) 
    if err != nil { 
     fmt.Printf("error: %v", err) 
     return 
    } 

    newV := Restructured{Person: v.Person, Id: v.Id} 

    output, err := xml.MarshalIndent(newV, " ", " ") 
    if err != nil { 
     fmt.Printf("error: %v\n", err) 
    } 

    os.Stdout.Write(output) 
} 

我不想這樣做,分配一個新類型的結構(「newV」)和複製字段。 有沒有什麼辦法自動用不同的xml標籤使用原始結構「v」進行編組?

+0

爲什麼(聯合)元帥呢?解析XML並即時輸出新結構。 – Volker

+0

只是不想手動解析XML。我目前的XML數據比上面的例子更復雜:)。到目前爲止,似乎「手動解析xml」或「使用第二個結構」是我唯一的選擇... – jihoonc

回答

2

使用第二個結構是我看到的最方便的方法。如果你不想讓它出口,實際上你可以隱藏其他類型的MarshalXML內:

func (r *Result) MarshalXML(enc *xml.Encoder, start xml.StartElement) error { 
    type Restructured struct { 
     Person string 
     ID  int `xml:"Id"` 
    } 
    rr := &Restructured{Person: r.Person, ID: r.ID} 
    return enc.Encode(rr) 
} 

遊樂場:http://play.golang.org/p/jZU2Jg0ZRZ