分享
golang动态解析xml
esrrhs · · 7463 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
package main
import (
"encoding/xml"
"fmt"
"mahonia"
"os"
"strconv"
"text/template"
)
type Attribute struct {
Name string
Value string
}
type Token struct {
Name string
Attributes []Attribute
Tokens []Token
}
type Result struct {
Root Token
}
var result = Result{}
func main() {
if !parse("config.xml") {
return
}
if !output("code_h.tpl", "code.h") {
return
}
if !output("code_cpp.tpl", "code.cpp") {
return
}
fmt.Println("OK")
}
func parse_token(decoder *xml.Decoder, tt xml.Token, mytoken *Token) {
token := tt.(xml.StartElement)
name := token.Name.Local
mytoken.Name = name
for _, attr := range token.Attr {
attrName := attr.Name.Local
attrValue := attr.Value
attr := Attribute{Name: attrName, Value: attrValue}
mytoken.Attributes = append(mytoken.Attributes, attr)
}
var t xml.Token
var err error
for t, err = decoder.Token(); err == nil; t, err = decoder.Token() {
switch t.(type) {
// 处理元素开始(标签)
case xml.StartElement:
mytoken.Tokens = append(mytoken.Tokens, Token{})
parse_token(decoder, t, &mytoken.Tokens[len(mytoken.Tokens)-1])
// 处理元素结束(标签)
case xml.EndElement:
return
case xml.CharData:
default:
return
}
}
}
func parse(filename string) bool {
file, err := os.Open(filename)
if err != nil {
fmt.Println(err)
return false
}
var t xml.Token
decoder := xml.NewDecoder(file)
t, decerr := decoder.Token()
if decerr != nil {
fmt.Println(decerr)
return false
}
parse_token(decoder, t, &result.Root)
fmt.Println("result", result.Root)
return true
}
func genlist(n string) []string {
num, _ := strconv.Atoi(n)
ret := make([]string, num)
for i := 0; i < num; i++ {
ret[i] = strconv.Itoa(i)
}
return ret
}
func iconv(str string) string {
enc := mahonia.NewEncoder("gb2312")
return enc.ConvertString(str)
}
func output(src string, des string) bool {
file, err := os.Create(des)
if err != nil {
fmt.Println(err)
return false
}
t := template.New("text")
if err != nil {
fmt.Println(err)
return false
}
t = t.Funcs(template.FuncMap{"genlist": genlist, "iconv": iconv})
srcfile, err := os.Open(src)
if err != nil {
fmt.Println(err)
return false
}
var buffer [1024 * 1024]byte
n, rerr := srcfile.Read(buffer[0:])
if rerr != nil {
fmt.Println(rerr)
return false
}
t, err = t.Parse(string(buffer[0:n]))
if err != nil {
fmt.Println(err)
return false
}
err = t.Execute(file, result.Root)
if err != nil {
fmt.Println(err)
return false
}
return true
}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信7463 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
package main
import (
"encoding/xml"
"fmt"
"mahonia"
"os"
"strconv"
"text/template"
)
type Attribute struct {
Name string
Value string
}
type Token struct {
Name string
Attributes []Attribute
Tokens []Token
}
type Result struct {
Root Token
}
var result = Result{}
func main() {
if !parse("config.xml") {
return
}
if !output("code_h.tpl", "code.h") {
return
}
if !output("code_cpp.tpl", "code.cpp") {
return
}
fmt.Println("OK")
}
func parse_token(decoder *xml.Decoder, tt xml.Token, mytoken *Token) {
token := tt.(xml.StartElement)
name := token.Name.Local
mytoken.Name = name
for _, attr := range token.Attr {
attrName := attr.Name.Local
attrValue := attr.Value
attr := Attribute{Name: attrName, Value: attrValue}
mytoken.Attributes = append(mytoken.Attributes, attr)
}
var t xml.Token
var err error
for t, err = decoder.Token(); err == nil; t, err = decoder.Token() {
switch t.(type) {
// 处理元素开始(标签)
case xml.StartElement:
mytoken.Tokens = append(mytoken.Tokens, Token{})
parse_token(decoder, t, &mytoken.Tokens[len(mytoken.Tokens)-1])
// 处理元素结束(标签)
case xml.EndElement:
return
case xml.CharData:
default:
return
}
}
}
func parse(filename string) bool {
file, err := os.Open(filename)
if err != nil {
fmt.Println(err)
return false
}
var t xml.Token
decoder := xml.NewDecoder(file)
t, decerr := decoder.Token()
if decerr != nil {
fmt.Println(decerr)
return false
}
parse_token(decoder, t, &result.Root)
fmt.Println("result", result.Root)
return true
}
func genlist(n string) []string {
num, _ := strconv.Atoi(n)
ret := make([]string, num)
for i := 0; i < num; i++ {
ret[i] = strconv.Itoa(i)
}
return ret
}
func iconv(str string) string {
enc := mahonia.NewEncoder("gb2312")
return enc.ConvertString(str)
}
func output(src string, des string) bool {
file, err := os.Create(des)
if err != nil {
fmt.Println(err)
return false
}
t := template.New("text")
if err != nil {
fmt.Println(err)
return false
}
t = t.Funcs(template.FuncMap{"genlist": genlist, "iconv": iconv})
srcfile, err := os.Open(src)
if err != nil {
fmt.Println(err)
return false
}
var buffer [1024 * 1024]byte
n, rerr := srcfile.Read(buffer[0:])
if rerr != nil {
fmt.Println(rerr)
return false
}
t, err = t.Parse(string(buffer[0:n]))
if err != nil {
fmt.Println(err)
return false
}
err = t.Execute(file, result.Root)
if err != nil {
fmt.Println(err)
return false
}
return true
}