1 Star 0 Fork 0

go-spring2/spring-base

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
log_reader.go 2.03 KB
一键复制 编辑 原始数据 按行查看 历史
kzhu 提交于 2025-04-03 19:09 +08:00 . first commit
/*
* Copyright 2012-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package log
import (
"bytes"
"encoding/xml"
"errors"
"io"
)
var (
readers = map[string]Reader{}
)
func init() {
RegisterReader(new(XMLReader), ".xml")
}
type Node struct {
Label string
Children []*Node
Attributes map[string]string
}
func (node *Node) child(label string) *Node {
for _, c := range node.Children {
if c.Label == label {
return c
}
}
return nil
}
// Reader 配置项解析器。
type Reader interface {
Read(b []byte) (*Node, error)
}
// RegisterReader 注册配置项解析器。
func RegisterReader(r Reader, ext ...string) {
for _, s := range ext {
readers[s] = r
}
}
type XMLReader struct{}
func (r *XMLReader) Read(b []byte) (*Node, error) {
stack := []*Node{{Label: "<<STACK>>"}}
d := xml.NewDecoder(bytes.NewReader(b))
for {
token, err := d.Token()
if err == io.EOF {
break
}
if err != nil {
return nil, err
}
switch t := token.(type) {
case xml.StartElement:
curr := &Node{
Label: t.Name.Local,
Attributes: make(map[string]string),
}
for _, attr := range t.Attr {
curr.Attributes[attr.Name.Local] = attr.Value
}
stack = append(stack, curr)
case xml.EndElement:
curr := stack[len(stack)-1]
parent := stack[len(stack)-2]
parent.Children = append(parent.Children, curr)
stack = stack[:len(stack)-1]
}
}
if len(stack[0].Children) == 0 {
return nil, errors.New("error xml config file")
}
return stack[0].Children[0], nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/go-spring2/spring-base.git
git@gitee.com:go-spring2/spring-base.git
go-spring2
spring-base
spring-base
v1.1.3

搜索帮助