我github.com/moovweb/gokogiri用来解析XML文档.以下在解析var b时工作,但是当我尝试相同的on var a(具有命名空间)时,我没有输出.如何解析具有命名空间的XML gokogiri?
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>`
Run Code Online (Sandbox Code Playgroud)
编辑#1:我也试过doc.RegisterNamespace但得到了
doc.RegisterNamespace undefined(type*xml.XmlDocument没有字段或方法RegisterNamespace)"
并x.RegisterNamespace得到
x.RegisterNamespace undefined(type*xpath.Expression没有字段或方法RegisterNamespace)"
尽管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>`
Run Code Online (Sandbox Code Playgroud)
0 thisthat
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
725 次 |
| 最近记录: |