// Package xmlpath implements a strict subset of the XPath specification for the Go language. // // The XPath specification is available at: // // http://www.w3.org/TR/xpath // // Path expressions supported by this package are in the following format, // with all components being optional: // // /axis-name::node-test[predicate]/axis-name::node-test[predicate] // // At the moment, xmlpath is compatible with the XPath specification // to the following extent: // // - All axes are supported ("child", "following-sibling", etc) // - All abbreviated forms are supported (".", "//", etc) // - All node types except for namespace are supported // - Predicates may be [N], [path], [not(path)], [path=literal] or [contains(path, literal)] // - Predicates may be joined with "or", "and", and parenthesis // - Richer expressions and namespaces are not supported // // For example, assuming the following document: // // // // // 0836217462 // Being a Dog Is a Full-Time Job // I'd dog paddle the deepest ocean. // // // Charles M Schulz // 1922-11-26 // 2000-02-12 // // // Peppermint Patty // 1966-08-22 // bold, brash and tomboyish // // // Snoopy // 1950-10-04 // extroverted beagle // // // // // The following examples are valid path expressions, and the first // match has the indicated value: // // /library/book/isbn => "0836217462" // library/*/isbn => "0836217462" // /library/book/../book/./isbn => "0836217462" // /library/book/character[2]/name => "Snoopy" // /library/book/character[born='1950-10-04']/name => "Snoopy" // /library/book//node()[@id='PP']/name => "Peppermint Patty" // //book[author/@id='CMS']/title => "Being a Dog Is a Full-Time Job", // /library/book/preceding::comment() => " Great book. " // //*[contains(born,'1922')]/name => "Charles M Schulz" // //*[@id='PP' or @id='Snoopy']/born => {"1966-08-22", "1950-10-04"} // // To run an expression, compile it, and then apply the compiled path to any // number of context nodes, from one or more parsed xml documents: // // path := xmlpath.MustCompile("/library/book/isbn") // root, err := xmlpath.Parse(file) // if err != nil { // log.Fatal(err) // } // if value, ok := path.String(root); ok { // fmt.Println("Found:", value) // } // package xmlpath