当前位置:  开发笔记 > 编程语言 > 正文

解组多个XML项目

如何解决《解组多个XML项目》经验,为你挑选了1个好方法。

我试图解组包含在具有相同结构的节点中的多个项目以进行进一步处理,但似乎无法访问数据,我不知道为什么.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.



1> James Henstr..:

你忽略了错误返回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.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有