我试图解组包含在具有相同结构的节点中的多个项目以进行进一步处理,但似乎无法访问数据,我不知道为什么.XML数据的结构如下(我试图访问所有Item
的:
NOAA/NOS/CO-OPS
Annual Tide Prediction
High/Low Tide Predictions
-
2015/12/31
Thu
5.3
162
H
-
2015/12/31
Thu
2.4
73
L
我的代码是:
package main import ( "encoding/xml" "fmt" "io/ioutil" "os" ) // TideData stores a series of tide predictions type TideData struct { Tides []Tide `xml:"data>item"` } // Tide stores a single tide prediction type Tide struct { Date string `xml:"date"` Day string `xml:"day"` Time string `xml:"time"` PredictionFt float64 `xml:"predictions_in_ft"` PredictionCm float64 `xml:"predictions_in_cm"` HighLow string `xml:"highlow"` } func (t Tide) String() string { return t.Date + " " + t.Day + " " + t.Time + " " + t.HighLow } func main() { xmlFile, err := os.Open("9414275 Annual.xml") if err != nil { fmt.Println("Error opening file:", err) return } defer xmlFile.Close() b, _ := ioutil.ReadAll(xmlFile) var tides TideData xml.Unmarshal(b, &tides) fmt.Println(tides) for _, datum := range tides.Tides { fmt.Printf("\t%s\n", datum) } }
运行时输出为空,这使我认为数据不是未编组的.输出是:
{[]}
James Henstr.. 5
你忽略了错误返回xml.Unmarshal
.通过稍微修改您的程序,我们可以看到发生了什么:
xml: encoding "ISO-8859-1" declared but Decoder.CharsetReader is nil
而在文档中闲逛,我们发现,在默认情况下的包只支持XML的UTF-8编码:
// CharsetReader, if non-nil, defines a function to generate // charset-conversion readers, converting from the provided // non-UTF-8 charset into UTF-8. If CharsetReader is nil or // returns an error, parsing stops with an error. One of the // the CharsetReader's result values must be non-nil. CharsetReader func(charset string, input io.Reader) (io.Reader, error)
因此,您似乎需要提供自己的字符集转换例程.您可以通过修改代码来注入它:
decoder := xml.NewDecoder(xmlFile) decoder.CharsetReader = makeCharsetReader err := decoder.Decode(&tides)
(请注意,我们现在正在从一个io.Reader
而不是一个字节数组进行解码,因此ReadAll
可以删除逻辑).该golang.org/x/text/encoding
套餐的家庭可能会帮助您实施makeCharsetReader
功能.像这样的东西可能会起作用:
import "golang.org/x/text/encoding/charmap" func makeCharsetReader(charset string, input io.Reader) (io.Reader, error) { if charset == "ISO-8859-1" { // Windows-1252 is a superset of ISO-8859-1, so should do here return charmap.Windows1252.NewDecoder().Reader(input), nil } return nil, fmt.Errorf("Unknown charset: %s", charset) }
然后,您应该能够解码XML.
你忽略了错误返回xml.Unmarshal
.通过稍微修改您的程序,我们可以看到发生了什么:
xml: encoding "ISO-8859-1" declared but Decoder.CharsetReader is nil
而在文档中闲逛,我们发现,在默认情况下的包只支持XML的UTF-8编码:
// CharsetReader, if non-nil, defines a function to generate // charset-conversion readers, converting from the provided // non-UTF-8 charset into UTF-8. If CharsetReader is nil or // returns an error, parsing stops with an error. One of the // the CharsetReader's result values must be non-nil. CharsetReader func(charset string, input io.Reader) (io.Reader, error)
因此,您似乎需要提供自己的字符集转换例程.您可以通过修改代码来注入它:
decoder := xml.NewDecoder(xmlFile) decoder.CharsetReader = makeCharsetReader err := decoder.Decode(&tides)
(请注意,我们现在正在从一个io.Reader
而不是一个字节数组进行解码,因此ReadAll
可以删除逻辑).该golang.org/x/text/encoding
套餐的家庭可能会帮助您实施makeCharsetReader
功能.像这样的东西可能会起作用:
import "golang.org/x/text/encoding/charmap" func makeCharsetReader(charset string, input io.Reader) (io.Reader, error) { if charset == "ISO-8859-1" { // Windows-1252 is a superset of ISO-8859-1, so should do here return charmap.Windows1252.NewDecoder().Reader(input), nil } return nil, fmt.Errorf("Unknown charset: %s", charset) }
然后,您应该能够解码XML.