XML/XPath: Difference between revisions

→‎{{header|Go}}: add encoding/xml example
No edit summary
(→‎{{header|Go}}: add encoding/xml example)
Line 764:
 
=={{header|Go}}==
Using the standard <code>encoding/xml</code> package:
<lang go>package main
 
import (
"encoding/xml"
"fmt"
"log"
"os"
)
 
type Inventory struct {
XMLName xml.Name `xml:"inventory"`
Title string `xml:"title,attr"`
Sections []struct {
XMLName xml.Name `xml:"section"`
Name string `xml:"name,attr"`
Items []struct {
XMLName xml.Name `xml:"item"`
Name string `xml:"name"`
UPC string `xml:"upc,attr"`
Stock int `xml:"stock,attr"`
Price float64 `xml:"price"`
Description string `xml:"description"`
} `xml:"item"`
} `xml:"section"`
}
 
// To simplify main's error handling
func printXML(s string, v interface{}) {
fmt.Println(s)
b, err := xml.MarshalIndent(v, "", "\t")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
fmt.Println()
}
 
func main() {
fmt.Println("Reading XML from standard input...")
 
var inv Inventory
dec := xml.NewDecoder(os.Stdin)
if err := dec.Decode(&inv); err != nil {
log.Fatal(err)
}
 
// At this point, inv is Go struct with all the fields filled
// in from the XML data. Well-formed XML input that doesn't
// match the specification of the fields in the Go struct are
// discarded without error.
 
// We can reformat the parts we parsed:
//printXML("Got:", inv)
 
// 1. Retrieve first item:
item := inv.Sections[0].Items[0]
fmt.Println("item variable:", item)
printXML("As XML:", item)
 
// 2. Action on each price:
fmt.Println("Prices:")
var totalValue float64
for _, s := range inv.Sections {
for _, i := range s.Items {
fmt.Println(i.Price)
totalValue += i.Price * float64(i.Stock)
}
}
fmt.Println("Total inventory value:", totalValue)
fmt.Println()
 
// 3. Slice of all the names:
var names []string
for _, s := range inv.Sections {
for _, i := range s.Items {
names = append(names, i.Name)
}
}
fmt.Printf("names: %q\n", names)
}</lang>
{{out}}
<pre>
Reading XML from standard input...
item variable: {{ item} Invisibility Cream 123456789 12 14.5 Makes you invisible}
As XML:
<item upc="123456789" stock="12">
<name>Invisibility Cream</name>
<price>14.5</price>
<description>Makes you invisible</description>
</item>
 
Prices:
14.5
23.99
4.95
3.56
Total inventory value: 3994.81
 
names: ["Invisibility Cream" "Levitation Salve" "Blork and Freen Instameal" "Grob winglets"]
</pre>
 
{{libheader|xmlpath}}
<lang go>package main
Anonymous user