2017-06-09 8 views
1

XMLをアンマーシャリングするときに、<Text Language="de">...</Text>は以下に示すように)を削除するにはどうすればよいですか?アンマーシャリング時に要素をスキップする方法は?

私はUnmarshalXMLメソッドで要素をスキップしようとしましたが、そのときに要素全体をスキップしています。

Example in Play Golang Link

import (
    "encoding/xml" 
    "fmt" 
) 

type Root struct { 
    Translation []Text `xml:"Texts>Text>Text"` 
} 

type Text struct { 
    Language string `xml:"Language,attr"` 
    Value string `xml:"Value"` 
} 

func main() { 
    foo := ` 
     <Root> 
      <Texts> 
       <Text> 
        <Text Language="EN"> 
         <Value>One</Value> 
        </Text> 
        <Text Language="de"> 
         <Value>Eins</Value> 
        </Text> 
       </Text> 
      </Texts> 
     </Root> 
     ` 

    var root Root 
    e := xml.Unmarshal([]byte(foo), &root) 
    if e != nil { 
     panic(e) 
    } 

    fmt.Printf("%+v\n", root) 
} 

func (t *Text) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 
    tx := struct{ Language, Value string }{} 

    if start.Attr[0].Value == "EN" { 
     d.DecodeElement(&tx, &start) 

     // I couldn't got Language attr here 
     *t = Text{tx.Language, tx.Value} 
     // fmt.Printf("hey: %+v %s\n", tx, start.Attr[0].Value) 
    } else { 
     // It outputs DE element with empty fields 
     d.Skip() 
    } 

    return nil 
} 

メイン電流出力パッケージ:

{Translation:[{Language: Value:One} {Language: Value:}]} 

私が欲しいもの:

{Translation:[{Language:EN Value:One}]} 
+2

平野アンマーシャリングおよび後処理あなたは、このような何かを試みることができます。 – Volker

+0

答えを見て、方法があります。 –

答えて

2

テキストレベルでアンマーシャリングすることで低すぎる操作をしています。まだ2つ目のテキスト要素をアンマーシャリングしているため、空の2番目の要素が表示されています。

package main 

import (
    "encoding/xml" 
    "fmt" 
) 

type Root struct { 
    Translation Text `xml:"Texts>Text>Text"` 
} 

type Text []struct { 
    Language string `xml:"Language,attr"` 
    Value string `xml:"Value"` 
} 

func main() { 
    foo := ` 
     <Root> 
      <Texts> 
       <Text> 
        <Text Language="EN"> 
         <Value>One</Value> 
        </Text> 
        <Text Language="de"> 
         <Value>Eins</Value> 
        </Text> 
       </Text> 
      </Texts> 
     </Root> 
     ` 

    var root Root 
    e := xml.Unmarshal([]byte(foo), &root) 
    if e != nil { 
     panic(e) 
    } 

    fmt.Printf("%+v\n", root) 
} 

func (t *Text) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 
    tx := []struct{ 
     Language string `xml:"Language,attr"` 
     Value string `xml:"Value"` 
    }{} 
    d.DecodeElement(&tx, &start) 


    tSl := *t 
    for _, elem := range tx { 
     switch elem.Language { 
     case "EN": 
      tSl = append(tSl, struct{ 
       Language string `xml:"Language,attr"` 
       Value string `xml:"Value"`}{elem.Language, elem.Value}) 
     default: 
      d.Skip() 
     } 
    } 
    *t = tSl 
    return nil 
} 

出力:

{Translation:[{Language:EN Value:One}]} 
+0

それは素晴らしいです!どうもありがとうございました。 –

+0

できるだけ私のプロフィールから外出先で私の他の質問を見ることができますか?多分あなたは彼らの答えも持っています。まだ誰も彼らに答えられなかった。 –

関連する問題