我正在练习 xml 解码,但我遇到了问题。出于某种原因,解码时,Unmarshal 函数仅解码结构的第一个元素。所有其他的都被忽略,尽管它们是在 byteValue 变量中读取的。有一个 XML 结构
<?xml version="1.0" encoding="UTF-8"?>
<Person id="13">
<name>
<first>Abigail</first>
<last>Moriarti</last>
</name>
</Person> <Person id="15">
<name>
<first>James</first>
<last>Willow</last>
</name>
</Person> <Person id="16">
<name>
<first>Margareth</first>
<last>O"Nil</last>
</name>
</Person> <Person id="17">
<name>
<first>Lowan</first>
<last>de Vega</last>
</name>
</Person>
我的解密代码:
type Person struct {
XMLName xml.Name `xml: "person"`
Id int `xml:"id,attr"`
FirstName string `xml:"name>first"`
LastName string `xml:"name>last"`
}
func FullDecode() {
xmlFile, err := os.Open("EncodeData.xml")
if err != nil {
fmt.Println(err)
}
fmt.Println("Successfully Opened EncodeData.xml")
defer xmlFile.Close()
byteValue, _ := ioutil.ReadAll(xmlFile)
var persons []Person
err = xml.Unmarshal(byteValue, &persons)
if err != nil {
log.Fatal("Cannot Decode xml")
}
Writefile, err := os.Create("DecodeData.txt")
for _, person := range persons {
finastring := string(person.Id) + " " + person.FirstName + " " + person.LastName
Writefile.WriteString(finastring)
}
}
结果值:
1.
2. Abigail Moriarti
为什么在这个例子中 Unmarshal 不解码整个文件,而是在第一个元素处停止?
在 XML 文档中,顶层必须只有一个元素。如果有多个这样的元素,那么它就是一个无效的 XML 文档。
您需要将人员列表包装在某种标签中。例如
<persons></persons>
:这是成功解析此类 XML 的示例代码。
Persons []Person
在结构中要注意Persons
——正是这个数组向解析器表明person
可以有多个元素。更新
如果您需要解析不正确的 XML 文件,则可以使用流式解码器来完成
xml.Decoder
无效文件
persons2.xml
:如何解析它:
循环调用,
d.Decode
直到调用返回错误。结果(https://go.dev/play/p/qfMb1kclPSi):