I can't find a way to work properly with Xpath in the cpp runtime of ANTLR4. Precisely, I have noticed that the path.split(..)
function always returns an empty vector. As a result the function path.evaluate(context)
always returns the unmodified (input) context parameter.
I was expecting to get at least two Xpath elements (root //
and wildecar *
) with the following code :
const std::string xpath_str ="//*/ID"; antlr4::tree::xpath::XPath path(&parser, xpath_str); std::vector<tree::xpath::XPathElement> elements = path.split(xpath_str); std::cout << "Nb XpAth Elements :"<< elements.size() << std::endl;
but it returns 0 elements.
Can you help me with this ?
ps: I raised an issue about it on Github because I'm not sure whether the problem is in the cpp runtime or not.
EDIT
I found a minor bug in the current release of the Cpp runtime.
The code in xPath.cpp
:
std::vector<XPathElement> XPath::split(const std::string &path) { ANTLRFileStream in(path);
should be replaced by :
std::vector<XPathElement> XPath::split(const std::string &path) { ANTLRInputStream in(path);
otherwise the split
function doesn't behave as in other runtime (it expect a file instead of a string).
I have made a pull request.
However the Xpath feature still doesn't work.
The following code always return an empty string (I'm sure of the value of the xpath as it works with the c# runtime)
const std::string xpath_enum = "*//enumerator/Identifier"; antlr4::tree::xpath::XPath finder(_parser, xpath_enum); std::vector<antlr4::tree::ParseTree *>subtrees = finder.evaluate(context);
Can anyone help me with this ?
0 comments:
Post a Comment