2012-11-16 22 views
16

Patrząc na go xml package nie mogę znaleźć takiej możliwości. Go pozwala tylko definiować drzewa struktur, mapować je do drzewa XML i deserializować za pomocą xml.NewDecoder(myXmlString).Decode(myStruct).Jak uzyskać wartość z XML przy użyciu XPath Przejdź

Nawet gdybym definiować potrzebne drzewo struktur GO, nadal nie mogę zapytać to drzewo za pomocą XPath.

C# ma wygodną funkcję SelectSingleNode, która pozwala wybrać wartość z drzewa XML, określając XPath bez powielania całej struktury drzewa w klasach C#.

Czy istnieje podobna możliwość w Go? Jeśli nie, to jaki jest najprostszy sposób na jego wdrożenie (ewentualnie ponowne użycie pakietu xml)?

Odpowiedz

3

Choć nie XPath można odczytać wartości z pliku XML z natywnym go xml encoder opakowaniu. Można użyć funkcji xml.Unmarshal(). Here to przykład odtwarzania.

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

Nie ma parsowania XPath w pakietach standardowych Go, więc trzeba uciekać się do używania 3rd paczka party.

Pewnego Znam to Gokogiri
Pakiet jest oparty na libxml2 wykorzystaniem CGO

Podpakiet chcesz importować jest github.com/moovweb/gokogiri/xpath

9

Istnieje również pakiet xmlpath.

wykorzystanie próbki:

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) 
} 
+0

Czy wiesz, jak można go użyć z wyjściem http.Get? – Mahdi

1

xquery CAN pozwala wyodrębnić dane z dokumentów XML za pomocą XPath, jego wdrożenie 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()) 
} 
Powiązane problemy