2012-11-16 14 views
16

Guardando a go xml package Non ho potuto trovare tale possibilità. Go consente solo di definire l'albero delle strutture, mapparle sull'albero XML e deserializzare utilizzando xml.NewDecoder(myXmlString).Decode(myStruct).Come ottenere un valore da un XML utilizzando XPath in Go

Anche se definisco le strutture Tree of Go necessarie, non riesco ancora a interrogare quell'albero utilizzando XPath.

C# ha la comoda funzione SelectSingleNode che consente di selezionare il valore dall'array XML specificando XPath senza duplicare l'intera struttura ad albero nelle classi C#.

Esiste una possibilità simile in Go? In caso contrario, qual è il modo più semplice per implementarlo (possibilmente riutilizzando il pacchetto xml)?

risposta

3

Anche se non XPath, è possibile leggere i valori di XML con il pacchetto nativo go xml encoder. Dovresti usare la funzione xml.Unmarshal(). Here è un esempio di riproduzione go.

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

Non c'è l'analisi xpath nei pacchetti standard di Go, quindi è necessario ricorrere all'utilizzo di un pacchetto di terze parti.

Poi uno che conosco è Gokogiri
Il pacchetto si basa su libxml2 utilizza CGO

Il subpackage si desidera importare è github.com/moovweb/gokogiri/xpath

9

C'è anche il pacchetto xmlpath.

utilizzo Esempio:

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

Sai come potrebbe essere utilizzato con l'output http.Get? – Mahdi

1

xquery lattina consente di estrarre i dati dai documenti XML usando XPath, la sua un'implementazione 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()) 
} 
Problemi correlati