csss 0.2.1

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

Released 2017-08-10.

To install, run:

haxelib install csss 0.2.1

See using Haxelib in Haxelib documentation for more information.

This is not the latest stable version of csss. See version 0.2.2 for the latest version.

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).

  • 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.Parser;
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 = Parser.parse(file, false).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"