Подтвердить что ты не робот

Как получить значение из XML с помощью XPath в Go

Глядя на go xml package Я не мог найти такую ​​возможность. Go позволяет определять дерево структур, сопоставлять их с деревом XML и десериализовать с помощью xml.NewDecoder(myXmlString).Decode(myStruct).

Даже если я определяю необходимое дерево структур Go, я все равно не могу запросить это дерево с помощью XPath.

С# имеет удобную функцию SelectSingleNode, которая позволяет выбрать значение из дерева XML, указав XPath без дублирования всей структуры дерева в классах С#.

Есть ли аналогичная возможность в Go? Если нет, то какой самый простой способ реализовать его (возможно, повторно использовать пакет xml)?

4b9b3361

Ответ 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())
}