Golang解码MusicXML

时间:2017-09-13 17:20:24

标签: xml go musicxml

我正在编写一个程序,可以读取完整的MusicXML文件,编辑它,然后写出一个新文件。我正在使用xml.Decode将数据读入MusicXML文件的结构中,但是当我运行它时似乎没有任何事情发生。我尝试将Decode对象打印到屏幕上,但是它打印了一个满字节的结构。

我查看了xml包页面,我似乎无法找到任何覆盖Decode函数的线程。我尝试使用UnMarshall根据我发现的一些指示,但是那些没有用(大多数线程都比较旧,所以也许UnMarshall的工作方式有点不同,因为Decode实现了?)。

这是输入功能:

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
}

这里是前几个结构(其余结构采用相同的格式):

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"`
}

我非常感谢任何见解。

1 个答案:

答案 0 :(得分:1)

我认为您误解了解码器的行为:它将XML 解码为您传递给Decode的对象

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

您将解码器视为包含您的文档,但它只是一个解码器。它解码。为了使代码更清晰,不应将其命名为song - 应该命名为decoderscoreDecoder或者您有什么名称。您几乎肯定不想从您的函数返回*xml.Decoder*,而是要解码Score