要在 Golang 中遍历 XML 数据,可以通过构造递归结构体并使用 walk 函数来利用普通编码/xml 方法.
type Node struct { XMLName xml.Name Content []byte `xml:",innerxml"` Nodes []Node `xml:",any"` } func walk(nodes []Node, f func(Node) bool) { for _, n := range nodes { if f(n) { walk(n.Nodes, f) } } }
考虑以下 XML:
<content> <p>this is content area</p> <animal> <p>This id dog</p> <dog> <p>tommy</p> </dog> </animal> <birds> <p>this is birds</p> <p>this is birds</p> </birds> <animal> <p>this is animals</p> </animal> </content>
遍历 XML 并处理每个节点及其子节点:
将 XML 解组为结构体:
var content Node if err := xml.Unmarshal(xmlData, &content); err != nil { // handle error }
使用 walk 函数遍历结构体:
walk(content.Nodes, func(n Node) bool { // Process the node or traverse its child nodes here fmt.Printf("Node: %s\n", n.XMLName.Local) return true })
对于有属性的节点,这里有一个增强的version:
type Node struct { XMLName xml.Name Attrs []xml.Attr `xml:",any,attr"` Content []byte `xml:",innerxml"` Nodes []Node `xml:",any"` } func (n *Node) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { n.Attrs = start.Attr type node Node return d.DecodeElement((*node)(n), &start) }
这允许访问节点处理逻辑中的属性。
以上是如何在Golang中高效遍历XML数据?的详细内容。更多信息请关注PHP中文网其他相关文章!