package main import ( "bufio" "bytes" "encoding/xml" "fmt" "io" "os" ) func process(r *bufio.Reader) { var ( intitle bool inarticlemeta bool buffer bytes.Buffer ) dec := xml.NewDecoder(r) for { token, err := dec.Token() if err == io.EOF { break } if err != nil { fmt.Fprintf(os.Stderr, "Error when decoding XML file %q\n", err) os.Exit(1) } switch t := token.(type) { case xml.StartElement: if t.Name.Local == "article-meta" { inarticlemeta = true continue } if t.Name.Local == "article-title" && inarticlemeta { intitle = true } case xml.CharData: if !intitle || !inarticlemeta { continue } buffer.Write(t) case xml.EndElement: if t.Name.Local == "article-meta" { inarticlemeta = false continue } if t.Name.Local == "article-title" && inarticlemeta { intitle = false fmt.Printf("article-title: %s\n", buffer.String()) buffer.Reset() } } } } func main() { for _, arg := range os.Args[1:] { file, err := os.Open(arg) if err != nil { fmt.Fprintf(os.Stderr, "Error when opening file %q\n", arg) os.Exit(1) } r := bufio.NewReader(file) process(r) file.Close() } }