26

go xmlパッケージを見ると、そのような可能性は見つかりませんでした。 Goでは、構造のツリーを定義し、それらをXMLツリーにマップし、を使用して逆シリアル化することしかできませんxml.NewDecoder(myXmlString).Decode(myStruct)

必要なGo構造のツリーを定義しても、XPathを使用してそのツリーをクエリすることはできません。

C#には便利な関数SelectSingleNodeがあり、C#クラスでツリー構造全体を複製することなくXPathを指定することでXMLツリーから値を選択できます。

Goにも同様の可能性はありますか?そうでない場合、それを実装する最も簡単な方法は何ですか(おそらくxmlパッケージを再利用します)?

4

4 に答える 4

14

Goの標準パッケージにはxpath解析がないため、サードパーティのパッケージを使用する必要があります。

それから私が知っているのはGokogiriですパッケージはcgoを使用したlibxml2
に基づいています

インポートするサブパッケージはgithub.com/moovweb/gokogiri/xpath

于 2012-11-16T07:14:12.243 に答える
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 に答える
8

xpathではありませんが、ネイティブのgoxmlエンコーダーパッケージを使用して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 に答える