2017-09-13 4 views
0

私は完全なMusicXMLファイルを読み込んで編集し、新しいファイルを書き出すことができるプログラムを作成しています。私はxml.Decodeを使ってMusicXMLファイルの構造体にデータを読み込んでいますが、実行すると何も起こらないようです。デコードオブジェクトを画面に印刷しようとしましたが、バイトでいっぱいの構造体を印刷しました。ゴランデコードMusicXML

xmlパッケージのページを見てきましたが、デコード機能をカバーするスレッドが見つからないようです。私は見つけたポインタのいくつかに応じてUnMarshallを使ってみましたが、うまくいきませんでした(これらのスレッドの大部分は古いので、UnMarshallはデコードが実装されて以来少し違って動作します)。

ここで入力機能があります:私は非常に任意の洞察力に感謝

type Score struct { 
    Work   Work   `xml:"work"` 
    Identification Identification `xml:"identification"` 
    Defaults  Defaults  `xml:"defaults"` 
    Credit   Credit   `xml:"credit"` 
    Partlist  []Scorepart `xml:"score-part"` 
    Part   []Part   `xml:"part"` 
} 

// Name and other idenfication 
type Work struct { 
    Number string `xml:"work-number"` 
    Title string `xml:"work-title"` 
} 

type Identification struct { 
    Type  string  `xml:"type,attr"` 
    Creator string  `xml:"creator"` 
    Software string  `xml:"software"` 
    Date  string  `xml:"encoding-date"` 
    Supports []Supports `xml:"supports"` 
    Source string  `xml:"source"` 
} 

func ImportXML(infile string) *xml.Decoder { 
    // Reads music xml file to memory 
    f, err := os.Open(infile) 
    if err != nil { 
     fmt.Fprintf(os.Stderr, "Error opening music xml file: %v\n", err) 
     os.Exit(1) 
    } 
    defer f.Close() 
    fmt.Println("\n\tReading musicXML file...") 
    song := xml.NewDecoder(io.Reader(f)) 
    // must pass an interface pointer to Decode 
    err = song.Decode(&Score{}) 
    if err != nil { 
     fmt.Fprintf(os.Stderr, "Error assigning musicXML file to struct: %v\n", err) 
     os.Exit(1) 
    } 
    return song 
} 

は、ここで最初の数の構造体(残りは同じフォーマットに従う)です。

答えて

1

私はあなたがデコーダの動作を誤解したと思う:それはあなたがDecodeに渡すオブジェクトにXML をデコード:

song := xml.NewDecoder(io.Reader(f)) 
score := Score{} 
err = song.Decode(&score) 
// Decoded document is in score, *NOT* in song 
return score 

それはあなたの文書が含まれていますかのようにあなたはデコーダを処理しています、それは単なるデコーダです。それはデコードします。コードをより明確にするため、songという名前にすることはできません。たとえば、decoderまたはscoreDecoderなどの名前を付ける必要があります。関数から*xml.Decoder*を返すことはほとんどありませんが、デコードされたのはScoreです。

+0

本当に正しいですか?もちろん、それは非常に痛いほど明白な何かに持っていた。助けてくれてありがとう! –