本文详解在 go 中使用 gokogiri 解析含默认命名空间(xmlns="...")的 xml 时的关键步骤:必须显式注册命名空间前缀并将其用于 xpath 表达式,否则节点将无法匹配。
在使用 gokogiri(Moovweb 维护的 libxml2 Go 封装)解析 XML 时,若文档声明了默认命名空间(如
正确做法是:
以下是完整可运行示例:
package main
import (
"fmt"
"github.com/moovweb/gokogiri"
"github.com/moovweb/gokogiri/xpath"
)
func main() {
xmlWithNS := `
thisthat
h
ello
`
doc, err := gokogiri.ParseXml([]byte(xmlWithNS))
if err != nil {
panic(err)
}
defer doc.Free()
// ✅ 关键:获取 XPath 上下文并注册命名空间
xp := doc.DocXPathCtx()
xp.RegisterNamespace("ns", "http://example.com/this")
// ✅ 关键:XPath 必须包含已注册的前缀
x := xpath.Compile("//ns:NodeB")
nodes, err := doc.Search(x)
if err != nil {
fmt.Printf("XPath error: %v\n", err)
return
}
fmt.Printf("Found %d NodeB elements:\n", len(nodes))
for i, node := range nodes {
fmt.Printf("%d: %s\n", i, node.Content())
}
}输出:
Found 2 NodeB elements: 0: thisthat 1: hello
⚠️ 注意事项:
总结:处理命名空间不是“可选项”,而是 libxml2 的强制语义。gokogiri 要求开发者显式桥接 XML 命名空间与 XPath 查询逻辑——通过 DocXPathCtx() + RegisterNamespace() + 带前缀 XPath 三步组合,即可稳健解析任意命名空间场景。