2010-02-24 4 views
4

Привет дал следующий код:XPATH запрос не возвращает результат

private void extractLink(ScriptFile file) throws SAXException, IOException, 
    ParserConfigurationException, XPathExpressionException { 
    Document d = this.parseFile(file); 
    XPathFactory xpf = XPathFactory.newInstance(); 
    XPath xpath = xpf.newXPath(); 
    XPathExpression expr = xpath.compile("//link"); 
    Object result = expr.evaluate(d, XPathConstants.NODE); 
    Node node = (Node) result; 
    if(result!=null) 
    { 
    this.log.debug("Links found: "+node.toString()); 
    } 
    else 
    { 
    this.log.debug("No link found!"); 
    } 
} 

private Document parseFile(ScriptFile file) throws SAXException, IOException, ParserConfigurationException 
{ 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    dbf.setValidating(false); 
    dbf.setNamespaceAware(true); 
    dbf.setIgnoringComments(true); 
    dbf.setIgnoringElementContentWhitespace(false); 
    dbf.setExpandEntityReferences(false); 
    dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    return db.parse(new ByteArrayInputStream(file.getFile())); 
} 

И вход как:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head profile="http://selenium-ide.openqa.org/profiles/test-case"> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<link rel="selenium.base" href="" /> 
<title>Default-Config-Accounts</title> 
</head> 
<body> 
</body> 
</html> 

Почему мой обратный запрос нуль?

ответ

2

Я не знаком с Java вообще, но мои подозрения XPath вызваны отсутствием (очевидным для меня) обработки пространства имен в вашем коде. С вашего ввода тег находится в пространстве имен по умолчанию «http://www.w3.org/1999/xhtml», поэтому я ожидаю, что вам придется написать код, который сообщает аппарату Java XPath об этом пространстве имен.

Немного googling находит эту полезную запись в блоге XPath with namespaces in Java, которая выглядит так, как будто она решит вашу проблему.

+0

Спасибо Dan! Ты был прав. Это проблема с пространством имен. Запись в блоге решила мою проблему. – er4z0r

+0

+1. Это всегда проблема пространства имен ... пространства имен XML никогда не перестают быть неожиданностью. Очевидно, что их покончили с «еще одним атрибутом, о котором мне не нужно заботиться». – Tomalak

Смежные вопросы