Как получить значение из XML с помощью XPath в Go
Глядя на go xml package Я не мог найти такую возможность.
Go позволяет определять дерево структур, сопоставлять их с деревом XML и десериализовать с помощью xml.NewDecoder(myXmlString).Decode(myStruct)
.
Даже если я определяю необходимое дерево структур Go, я все равно не могу запросить это дерево с помощью XPath.
С# имеет удобную функцию SelectSingleNode, которая позволяет выбрать значение из дерева XML, указав XPath без дублирования всей структуры дерева в классах С#.
Есть ли аналогичная возможность в Go?
Если нет, то какой самый простой способ реализовать его (возможно, повторно использовать пакет xml)?
Ответы
Ответ 1
Даже если это не xpath, вы можете читать значения из XML с помощью встроенного go xml encoder. Вы должны использовать функцию 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)
}
Ответ 2
В стандартных пакетах Go нет синтаксиса xpath, поэтому вам нужно прибегнуть к использованию стороннего пакета.
Затем я знаю, что Gokogiri
Пакет основан на libxml2, используя cgo
Подпакет, который вы хотите импортировать, github.com/moovweb/gokogiri/xpath
Ответ 3
Также есть пакет 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)
}
Ответ 4
xquery позволяет вам извлекать данные из XML-документов с помощью XPath, его xpath.
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())
}