or add the following import and run project with go get
import "github.com/tdewolff/parse/v2/xml"
Lexer
Usage
The following initializes a new Lexer with io.Reader r:
l := xml.NewLexer(parse.NewInput(r))
To tokenize until EOF an error, use:
for { tt, data := l.Next()switch tt {case xml.ErrorToken:// error or EOF set in l.Err()returncase xml.StartTagToken:// ...for { ttAttr, dataAttr := l.Next()if ttAttr != xml.AttributeToken {// handle StartTagCloseToken/StartTagCloseVoidToken/StartTagClosePITokenbreak }// ... }case xml.EndTagToken:// ... }}
All tokens:
ErrorToken TokenType =iota// extra token when errors occurCommentTokenCDATATokenStartTagTokenStartTagCloseTokenStartTagCloseVoidTokenStartTagClosePITokenEndTagTokenAttributeTokenTextToken
Examples
packagemainimport ("os""github.com/tdewolff/parse/v2/xml")// Tokenize XML from stdin.funcmain() { l := xml.NewLexer(parse.NewInput(os.Stdin))for { tt, data := l.Next()switch tt {case xml.ErrorToken:if l.Err() != io.EOF { fmt.Println("Error on line", l.Line(), ":", l.Err()) }returncase xml.StartTagToken: fmt.Println("Tag", string(data))for { ttAttr, dataAttr := l.Next()if ttAttr != xml.AttributeToken {break } key := dataAttr val := l.AttrVal() fmt.Println("Attribute", string(key), "=", string(val)) }// ... } }}