2012-11-16 57 views
16

看着go xml package我找不到这种可能性。 Go只允许定义结构树,将它们映射到XML树并使用xml.NewDecoder(myXmlString).Decode(myStruct)反序列化。如何在Go中使用XPath从XML中获取值

即使我定义了Go结构所需的树,我仍然无法使用XPath查询该树。

C#具有方便的功能SelectSingleNode,允许通过指定XPath从XML树中选择值,而无需在C#类中复制整个树结构。

Go有没有类似的可能性? 如果没有,那么实现它的最简单方法是什么(可能重用xml包)?

回答

3

即使不XPath的,你可以用本地go xml encoder包读值出XML的。您将使用xml.Unmarshal()函数。 Here是一个好玩的例子。

package main 

import "fmt" 
import "encoding/xml" 

func main() { 
    type People struct { 
     Names []string `xml:"Person>FullName"` 
    } 

    data := ` 
     <People> 
      <Person> 
       <FullName>Jerome Anthony</FullName> 
      </Person> 
      <Person> 
       <FullName>Christina</FullName> 
      </Person> 
     </People> 
    ` 

    v := People{Names: []string{}} 
    err := xml.Unmarshal([]byte(data), &v) 
    if err != nil { 
     fmt.Printf("error: %v", err) 
     return 
    } 
    fmt.Printf("Names of people: %q", v) 
} 
11

Go的标准包中没有xpath解析,因此您需要诉诸使用第三方包。

然后一个我所知道的是Gokogiri
包是基于使用CGO

要导入的子包是github.com/moovweb/gokogiri/xpath

9

另外还有xmlpath的libxml2

使用范例:

path := xmlpath.MustCompile("/library/book/isbn") 
root, err := xmlpath.Parse(file) 
if err != nil { 
    log.Fatal(err) 
} 
if value, ok := path.String(root); ok { 
    fmt.Println("Found:", value) 
} 
+0

你知道如何使用http.Get输出吗? – Mahdi

1

xquery可以让你使用XPath,它是一个xpath实现从XML文档提取数据。

package main 

import (
    "fmt" 
    "strings" 
    "github.com/antchfx/xquery/xml" 
) 

func main() { 
    htmlstr := `<?xml version="1.0" ?> 
    <html> 
    <head> 
    <title>this is a title</title> 
    </head> 
    <body>Hello,World</body> 
    </html>` 
    root, err := xmlquery.Parse(strings.NewReader(htmlstr)) 
    if err != nil { 
     panic(err) 
    } 
    title := xmlquery.FindOne(root, "//title") 
    fmt.Println(title.InnerText()) 
}