26

查看go xml 包我找不到这种可能性。 Go只允许定义结构树,将它们映射到 XML 树并使用xml.NewDecoder(myXmlString).Decode(myStruct).

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

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

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

4

4 回答 4

14

还有xmlpath包。

示例用法:

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)
}
于 2013-08-01T13:26:58.873 回答
14

Go 的标准包中没有 xpath 解析,因此您需要使用 3rd 方包。

然后我知道的一个是Gokogiri
包是基于libxml2使用cgo

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

于 2012-11-16T07:14:12.243 回答
8

即使不是 xpath,您也可以使用本机go xml 编码器包从 XML 中读取值。您将使用 xml.Unmarshal() 函数。是一个围棋示例。

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)
}
于 2015-04-08T23:06:26.177 回答
6

xmlquery允许您使用 XPath 表达式从 XML 文档中提取数据。

package main

import (
    "fmt"
    "strings"
    "github.com/antchfx/xmlquery"
)

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())
}
于 2016-10-24T02:50:08.663 回答