在Go中进行XML解组时,我得到一个空的结果。我已经研究了其他SO问题,我注意到最常见的原因似乎是这些字段没有导出。在我的情况下不是这样,因为所有名称都以大写字母开头。
xml看起来像这样(在一个ROW
内有近1.000.000 ROWDATA
个标签):
<ROWDATA>
<ROW>
<ПІБ> ПОПКО РУСЛАН ВАСИЛЬОВИЧ</ПІБ>
<Місце_проживання>61112, Харківська обл., місто Харків, Московський район, ПРОСПЕКТ П'ЯТДЕСЯТИРІЧЧЯ ВЛКСМ, будинок 86, квартира 65</Місце_проживання>
<Основний_вид_діяльності>45.32 Роздрібна торгівля деталями та приладдям для автотранспортних засобів</Основний_вид_діяльності>
<Стан>зареєстровано</Стан>
</ROW>
</ROWDATA>
这就是我所做的:
package main
import (
"encoding/xml"
"fmt"
"golang.org/x/text/encoding/charmap"
"golang.org/x/text/transform"
"io/ioutil"
"os"
"strings"
)
type Rowdata struct {
XMLName xml.Name `xml:"ROWDATA"`
Rowdata []Row `xml:"ROW"`
}
type Row struct {
XMLName xml.Name `xml:"ROW"`
Location string `xml:"Місце_проживання"`
Director string `xml:"ПІБ"`
Activity string `xml:"Основний_вид_діяльності"`
City string `xml:"Стан"`
}
func main() {
xmlFile, err := os.Open("FOP_1.xml")
if err != nil {
fmt.Println(err)
}
defer xmlFile.Close()
byteValue, _ := ioutil.ReadAll(xmlFile)
koi8rString := transform.NewReader(strings.NewReader(string(byteValue)), charmap.Windows1251.NewDecoder())
decBytes, _ := ioutil.ReadAll(koi8rString)
var entries Rowdata
xml.Unmarshal(decBytes, &entries)
for i := 0; i < len(entries.Rowdata); i++ {
fmt.Println("Name: " + entries.Rowdata[i].Director)
}
}
最后一个for循环永远不会运行,因为长度为零。但是,我有一个类似的例子,文件已经是UTF8,因此不需要编码转换,并且进展顺利。我想知道在解码时我是否搞砸了什么?
更新:我使用字符串而不是Go Play Space中的文件测试了一个更简单的版本,它运行正常!但是,我的本地版本文件仍然不起作用,所以我怀疑它可能与文件的实际读取有关...
UPDATE2:我刚刚意识到xml.Unmarshall
会返回:
xml: encoding "windows-1251" declared but Decoder.CharsetReader is nil%
这可能是造成这种情况的原因......但这是什么意思?
答案 0 :(得分:2)
你提到你有“接近1.000.000 ROW标签”,在你的代码中你使用docker exec -it loving_hugle bash
curl localhost:8081
将它全部读入内存(两次!) - 这完全没有问题,你可能会耗尽内存。而不是将其读入内存,你应该使用“流”解码器,如
ioutil.ReadAll(xmlFile)