csss 0.2.2

CSS-Selector With a Modified Xml Parser(with the position info)

Released 2017-08-12.

To install, run:

haxelib install csss 0.2.2

See using Haxelib in Haxelib documentation for more information.

Current version0.2.2
StatisticsInstalled 3 times
Tags cross, css, parser, selector, utility, xml


CSS Selector

CSS-Selector With a Modified Xml Parser

  • Provide extra position info that can be used to locate invalid value/attr(optional)

Note: Use -D NO_POS will be able to disable this feature(then std.Xml will instead of csss.Xml).

If the position is not accurate. You may need add -D old-error-format

  • Not based on RegExp

  • No Dependencies

  • Ease To Use.

use .querySelector/one or .querySelectorAll/all to query XML. e.g. xml.querySelectorAll("a:not([href='#'])").

use .attrPos or .nodePos to got position of attributes/nodeName/nodeValue.

supported descendant selector:

` E : supported E F : supported E > F : supported E + F : supported Note: E ~ F : supported Note:`

supported pseudo-classes/element in Selector.hx


import csss.xml.Xml;
using csss.Query;

class Main {
    static function main() {

    macro static function mymacro() {
        var myxml = "bin/index.html";
        var file = sys.io.File.getContent(myxml);
        var body = Xml.parse(file).querySelector("body");

        var x = body.querySelector(".t2 span");                              // equal body.one(".t2 span")

        var a = body.querySelectorAll(".selector-test > :nth-child(2n+1)");  // equal body.all("...")
        for (x in a) {
        var attr = body.get("class");
        if (attr != "expected") {
            var p = body.attrPos("class");                                   // got position of attr
            var pos = haxe.macro.PositionTools.make({
                min: p,
                max: p + attr.length,
                file: myxml
            haxe.macro.Context.error("click this message to location where the error occurred.", pos);
        return macro null;

    static function str(x: Xml) {
        var s = "<" + x.nodeName;
        for (k in x.attributes()) {
            if (k.charCodeAt(0) != ":".code)
                s += ' $k="${x.get(k)}"';
        return s + ">";


  • [Insolvable] Do not suport escaped single/double quotes.

e.g: a[title="hi \"name\"."] will get a unexpected value.

  • Do not suport two consecutive + or ~. see Query TODO

Invalid: "li + li + li", "li ~ li ~ li", "li + li ~ li", "li ~ li + li"

Available: "li + li > li", "li + li li", "li li + li", "li > li > li"


  • 0.2.2: added Xml.parse that you no longer need to import csss.xml.Parse