TagSoup и XPath - PullRequest
       38

TagSoup и XPath

3 голосов
/ 22 июля 2011

Я пытаюсь использовать TagSoup с XPath (JAXP). Я знаю, как получить SAX-парсер из TagSoup (или XMLReader). Но я не смог найти, как создать DocumentBuilder, который будет использовать этот SAX-парсер. Как мне это сделать?

Спасибо.

РЕДАКТИРОВАТЬ: Извините за такой общий, но Java XML API такая боль.

EDIT2:

Проблема решена:

public static void main(String[] args) throws XPathExpressionException, IOException,
        SAXNotRecognizedException, SAXNotSupportedException,
        TransformerFactoryConfigurationError, TransformerException {

    XPathFactory xpathFac = XPathFactory.newInstance();
    XPath xpath = xpathFac.newXPath();

    InputStream input = new FileInputStream("/tmp/g.html");

    XMLReader reader = new Parser();
    reader.setFeature(Parser.namespacesFeature, false);
    Transformer transformer = TransformerFactory.newInstance().newTransformer();

    DOMResult result = new DOMResult();
    transformer.transform(new SAXSource(reader, new InputSource(input)), result);

    Node htmlNode = result.getNode();
    NodeList nodes = (NodeList) xpath.evaluate("//span", htmlNode, XPathConstants.NODESET);
    System.out.println(nodes.getLength());
}

EDIT3:

Ссылка, которая мне помогла: http://www.jezuk.co.uk/cgi-bin/view/jez?id=2643

1 Ответ

2 голосов
/ 22 июля 2011

API Java XML такая боль

Действительно, это так.Подумайте о переходе на XSLT 2.0 / XPath 2.0 и использовании вместо этого интерфейса Saxon s9api.Это будет выглядеть примерно так:

Processor proc = new Processor();

InputStream input = new FileInputStream("/tmp/g.html");
XMLReader reader = new Parser();
reader.setFeature(Parser.namespacesFeature, false);
Source source = new SAXSource(parser, input);

DocumentBuilder builder = proc.newDocumentBuilder();
XdmNode input = builder.build(source);

XPathCompiler compiler = proc.newXPathCompiler();
XdmValue result = compiler.evaluate("//span", input);
System.out.println(result.size());
...