Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
80
Task/XML-XPath/Go/xml-xpath-1.go
Normal file
80
Task/XML-XPath/Go/xml-xpath-1.go
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
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)
|
||||
}
|
||||
38
Task/XML-XPath/Go/xml-xpath-2.go
Normal file
38
Task/XML-XPath/Go/xml-xpath-2.go
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"launchpad.net/xmlpath"
|
||||
)
|
||||
|
||||
func main() {
|
||||
f, err := os.Open("test3.xml")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
n, err := xmlpath.Parse(f)
|
||||
f.Close()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
q1 := xmlpath.MustCompile("//item")
|
||||
if _, ok := q1.String(n); !ok {
|
||||
fmt.Println("no item")
|
||||
}
|
||||
q2 := xmlpath.MustCompile("//price")
|
||||
for it := q2.Iter(n); it.Next(); {
|
||||
fmt.Println(it.Node())
|
||||
}
|
||||
q3 := xmlpath.MustCompile("//name")
|
||||
names := []*xmlpath.Node{}
|
||||
for it := q3.Iter(n); it.Next(); {
|
||||
names = append(names, it.Node())
|
||||
}
|
||||
if len(names) == 0 {
|
||||
fmt.Println("no names")
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue