A quick XPath analyser with a SAX Parser. Some syntaxes are invalides, but all using syntax are presents. It's possible to catch many XPath in the same time.
XPathXMLHandler handler=new XPathXMLHandler()
{
@Override
public void findXPathNode(SAXXPath xpath, Object node)
{
System.out.println("node="+node);
}
};
handler.setXPaths(XPathXMLHandler.toXPaths("//b[@at_a='s3']/c"));
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(new InputSource(new StringReader(xml)), handler);
The node is orphan, with attributs and all childs texts nodes. It's possible to use with HtmlParser.
XPathXMLHandler handler=new XPathXMLHandler()
{
@Override
public void findXpathNode(SAXXPath xpath, Object node)
{
System.out.println("node="+node);
}
};
handler.setXPaths(XPathXMLHandler.toXPaths("//body/h1"));
HtmlParser htmlParser = new HtmlParser(XmlViolationPolicy.ALLOW);
htmlParser.setDoctypeExpectation(DoctypeExpectation.NO_DOCTYPE_ERRORS);
htmlParser.setContentHandler(handler);
htmlParser.parse(new InputSource(new StringReader(html)));
"'fixe'""1""/""/a/b/c""/a/text()""/a/@at_a""/a/b/@*""/a/b[@*]""/a/b[@at_a = 's3']""/a/b[@at_a > 2]""/a/b[@at_a >= 2]""/a/b[@at_a = @at_b]""/a/b[@at_a != @at_b]""/a/b[@at_a < 5]""/a/b[@at_a <= 2]""/a/b[@at_b='s2' or @at_b='3']""/a/b[@at_a='3' and @at_b='3']""/a/b/text()['toto']""/a/b[2]""/a/b/text()[2]""/a/b/@*[2]""//b/c""//b/c[2]""//b[2]/c[2]""//b[@at_a='s3']/c""//c/text()""//b/@at_a""//@at_a"
"//text()""//@*"- using dot, node(), functions, etc.
- using double predicat (
"/a/b[@at_a][1]") - using or (
"/a | /b")