我正在编写一个程序,可以读取完整的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"`
}
我非常感谢任何见解。
答案 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
- 应该命名为decoder
或scoreDecoder
或者您有什么名称。您几乎肯定不想从您的函数返回*xml.Decoder*
,而是要解码Score
。