簡體   English   中英

如何在Go中使用XPath從XML獲取值

[英]How to get a value from an XML using XPath in Go

看看去xml包我找不到這種可能性。 Go只允許定義結構樹,將它們映射到XML樹並使用xml.NewDecoder(myXmlString).Decode(myStruct)反序列化。

即使我定義了需要的Go結構樹,我仍然無法使用XPath查詢該樹。

C#具有方便的函數SelectSingleNode ,它允許通過指定XPath從XML樹中選擇值,而無需在C#類中復制整個樹結構。

Go有類似的可能嗎? 如果沒有,那么實現它的最簡單方法是什么(可能重用xml包)?

Go的標准包中沒有xpath解析,因此您需要使用第三方包。

然后我知道的是Gokogiri
該軟件包基於libxml2使用cgo

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

還有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)
}

即使不是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)
}

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())
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM