我正在解码一些仅包含字符串值和属性的 XML。它还"&"包含"&"一些"&". 我还将对这些字符串值做更多的工作,我需要字符"|"永远不会出现,所以我想"|"用"%7C".
我可以strings.Replace在解码后使用这些更改,但由于解码已经在做类似的工作(毕竟它确实转换"&"为"&")我想同时做。
我要解析的文件很大,所以我会做一些类似于http://blog.davidsingleton.org/parsing-huge-xml-files-with-go/
这是一个简短的示例 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<tests>
<test_content>X&amp;Y is a dumb way to write XnY | also here's a pipe.</test_content>
<test_attr>
<test name="Normal" value="still normal" />
<test name="X&amp;Y" value="should be the same as X&Y | XnY would have been easier." />
</test_attr>
</tests>
还有一些执行标准解码并打印出结果的 Go 代码:
package main
import (
"encoding/xml"
"fmt"
"os"
)
type XMLTests struct {
Content string `xml:"test_content"`
Tests []*XMLTest `xml:"test_attr>test"`
}
type XMLTest struct {
Name string `xml:"name,attr"`
Value string `xml:"value,attr"`
}
func main() {
xmlFile, err := os.Open("test.xml")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer xmlFile.Close()
var q XMLTests
decoder := xml.NewDecoder(xmlFile)
// I tried this to no avail:
// decoder.Entity = make(map[string]string)
// decoder.Entity["|"] = "%7C"
// decoder.Entity["&amp;"] = "&"
var inElement string
for {
t, _ := decoder.Token()
if t == nil {
break
}
switch se := t.(type) {
case xml.StartElement:
inElement = se.Name.Local
if inElement == "tests" {
decoder.DecodeElement(&q, &se)
}
default:
}
}
fmt.Println(q.Content)
for _, t := range q.Tests {
fmt.Printf("\t%s\t\t%s\n", t.Name, t.Value)
}
}
如何修改此代码以获得我想要的?即:如何定制解码器?
我查看了文档,特别是https://golang.org/pkg/encoding/xml/#Decoder并尝试使用实体地图,但我无法取得任何进展。
忽然笑
相关分类