使用 Go 探索 XML 数据
您在 Go 中导航 XML 数据时面临着挑战,特别是找到一种遍历后代的方法特定节点而不指定确切的 XPath。让我们探索一种可以帮助您完成此任务的方法。
递归和 Vanilla XML 编码
要实现深度遍历,您可以利用递归结构和直接遍历利用 Go 的 vanilla 编码/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) } } }
在此代码中,步行函数递归地访问每个节点的子节点。您可以提供自定义函数 f 来对各个节点执行操作。
例如,在您提供的 XML 中,您可以使用 walk 函数根据节点的类型来处理节点,如下所示:
func handleNode(n Node) bool { switch n.XMLName.Local { case "p": // Process paragraphs case "dog": // Process dogs } return true // Keep traversing } walk([]Node{root}, handleNode)
属性包含
如果您需要访问与节点关联的属性,您可以扩展 Node 结构并相应地自定义 UnmarshalXML 方法:
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) }
使用此修改后的结构,您可以在 walk 函数中检索属性:
func handleNode(n Node) bool { for _, a := range n.Attrs { // Process attributes } return true // Keep traversing }
通过利用递归和采用普通 XML 编码,您可以有效地遍历复杂的 XML 结构,轻松访问节点和属性。
以上是如何在不使用 XPath 的情况下在 Go 中高效地遍历 XML 后代?的详细内容。更多信息请关注PHP中文网其他相关文章!