Golang : Search and extract certain XML data example
There are times when you want to just search for certain element in huge XML data set and extract the element name and associated value(chardata) or attribute value.
In this tutorial, we will learn how to extract the "normal" type of XML data. Just by the element name and get the chardata value(text in between the element name). Then, followed by extraction example of XML attribute data.
Here you go!
package main
import (
"encoding/xml"
"fmt"
"strings"
)
var XMLdata = `<urlset>
<url>
<loc>http://www.example.com/xml-element-golang</loc>
<lastmod>2015-06-14</lastmod>
<changefreq>daily</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>http://www.example.com/extract-element-by-for-loop</loc>
<lastmod>2015-06-14</lastmod>
<changefreq>daily</changefreq>
<priority>0.5</priority>
</url>
<urlset>`
var XMLdata2 = `<ALEXA VER="0.9" URL="socketloop.com/" HOME="0" AID="=" IDN="socketloop.com/">
<SD>
<POPULARITY URL="socketloop.com/" TEXT="291466" SOURCE="panel"/>
<REACH RANK="237320"/>
<RANK DELTA="+31735"/>
<COUNTRY CODE="US" NAME="United States" RANK="191742"/>
</SD>
</ALEXA>`
// ignore <loc>, only use chardata because DecodeElement will work on <loc>
type XMLQuery struct {
Loc string `xml:",chardata"`
}
var l XMLQuery
func main() {
// example on handling XML chardata(string)
decoder := xml.NewDecoder(strings.NewReader(string(XMLdata)))
for {
// err is ignore here. IF you are reading from a XML file
// do not ignore err and also check for io.EOF
token, _ := decoder.Token()
if token == nil {
break
}
switch Element := token.(type) {
case xml.StartElement:
if Element.Name.Local == "loc" {
fmt.Println("Element name is : ", Element.Name.Local)
err := decoder.DecodeElement(&l, &Element)
if err != nil {
fmt.Println(err)
}
fmt.Println("Element value is : ", l.Loc)
}
}
}
fmt.Println("------------------------------------")
// example on handling XML attribute
decoder = xml.NewDecoder(strings.NewReader(string(XMLdata2)))
for {
// err is ignore here. IF you are reading from a XML file
// do not ignore err and also check for io.EOF
token, _ := decoder.Token()
if token == nil {
break
}
switch Element := token.(type) {
case xml.StartElement:
if Element.Name.Local == "REACH" {
fmt.Println("Element name is : ", Element.Name.Local)
attrName := Element.Attr[0].Name.Local
attrValue := Element.Attr[0].Value
fmt.Printf("Attribute name is [%s] and value is [%s] \n", attrName, attrValue)
}
}
}
}
http://play.golang.org/p/b5RpnKGwsV
References :
See also : Golang : delete and modify XML file content
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+7.8k Golang : Get today's weekday name and calculate target day distance example
+18.2k Golang : Get path name to current directory or folder
+21.7k Golang : Setting up/configure AWS credentials with official aws-sdk-go
+11.1k Golang : Proper way to test CIDR membership of an IP 4 or 6 address example
+9.6k Golang : Load ASN1 encoded DSA public key PEM file example
+6.5k Golang : How to determine if request or crawl is from Google robots
+6k Golang : Grab news article text and use NLP to get each paragraph's sentences
+13.2k CodeIgniter : "Fatal error: Cannot use object of type stdClass as array" message
+30.5k Golang : Remove characters from string example
+19.7k Golang : Measure http.Get() execution time
+10.1k Golang : Random Rune generator
+4.6k Chrome : How to block socketloop.com links in Google SERP?