我正在使用github.com/moovweb/gokogiri解析一个XML文档。以下内容在解析var b时有效,但是当我在var a (它有一个名称空间)上尝试同样的操作时,我没有得到输出。如何使用gokogiri解析具有命名空间的XML
package main
import (
"github.com/moovweb/gokogiri"
"github.com/moovweb/gokogiri/xpath"
"log"
)
func main() {
log.SetFlags(log.Lshortfile)
doc, _ := gokogiri.ParseXml([]byte(a))
defer doc.Free()
doc.SetNamespace("", "http://example.com/this")
x := xpath.Compile(".//NodeA/NodeB")
groups, err := doc.Search(x)
if err != nil {
log.Println(err)
}
for i, group := range groups {
log.Println(i, group)
}
}
var a = `<?xml version="1.0" ?><NodeA xmlns="http://example.com/this"><NodeB>thisthat</NodeB></NodeA>`
var b = `<?xml version="1.0" ?><NodeA><NodeB>thisthat</NodeB></NodeA>`编辑#1:我也尝试过doc.RegisterNamespace,但是
doc.RegisterNamespace未定义(类型*xml.XmlDocument没有字段或方法RegisterNamespace)“
和x.RegisterNamespace得到
x.RegisterNamespace未定义(类型*xpath.Expression没有字段或方法RegisterNamespace)“
发布于 2014-12-14 23:12:11
即使没有为XML中使用的名称空间分配前缀(即默认前缀),您也需要注册一个前缀,并在xpath表达式中使用它。
这个前缀可以是任何你喜欢的,这里我用的是ns。注意,它可能与文档中使用的前缀不同(如果有的话)--需要匹配的重要部分是名称空间字符串本身。
示例:
package main
import (
"fmt"
"github.com/moovweb/gokogiri"
"github.com/moovweb/gokogiri/xpath"
)
func main() {
doc, _ := gokogiri.ParseXml([]byte(a))
defer doc.Free()
xp := doc.DocXPathCtx()
xp.RegisterNamespace("ns", "http://example.com/this")
x := xpath.Compile("/ns:NodeA/ns:NodeB")
groups, err := doc.Search(x)
if err != nil {
fmt.Println(err)
}
for i, group := range groups {
fmt.Println(i, group.Content())
}
}
var a = `<?xml version="1.0" ?><NodeA xmlns="http://example.com/this"><NodeB>thisthat</NodeB></NodeA>`输出:
0 thisthathttps://stackoverflow.com/questions/27474239
复制相似问题