Поиск ключевого слова в узле и получение имени узла в DOM - PullRequest
3 голосов
/ 22 ноября 2011

Я хочу найти в DOM определенное ключевое слово, и когда оно будет найдено, я хочу знать, с какого узла в дереве оно.

static void search(String segment, String keyword) {

    if (segment == null)
        return;

    Pattern p=Pattern.compile(keyword,Pattern.CASE_INSENSITIVE);
    StringBuffer test=new StringBuffer (segment);
    matcher=p.matcher(test);

    if(!matcher.hitEnd()){        
        total++;
        if(matcher.find())
        //what to do here to get the node?
    }
}

public static void traverse(Node node) {
    if (node == null || node.getNodeName() == null)
        return;

    search(node.getNodeValue(), "java");

    check(node.getFirstChild());

    System.out.println(node.getNodeValue() != null && 
                       node.getNodeValue().trim().length() == 0 ? "" : node);
    check(node.getNextSibling());
}

1 Ответ

3 голосов
/ 23 ноября 2011

Рассмотрите возможность использования XPath ( API ):

// the XML & search term
String xml = "<foo>" + "<bar>" + "xml java xpath" + "</bar>" + "</foo>";
InputSource src = new InputSource(new StringReader(xml));
final String term = "java";
// search expression and term variable resolver
String expression = "//*[contains(text(),$term)]";
final QName termVariableName = new QName("term");
class TermResolver implements XPathVariableResolver {
  @Override
  public Object resolveVariable(QName variableName) {
    return termVariableName.equals(variableName) ? term : null;
  }
}
// perform the search
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setXPathVariableResolver(new TermResolver());
Node node = (Node) xpath.evaluate(expression, src, XPathConstants.NODE);

Если вы хотите выполнять более сложное сопоставление с помощью регулярных выражений, вы можете предоставить свой собственный распознаватель функций .

Разбивка выражения XPath //*[contains(text(),$term)]:

  • //* звездочкой выделен любой элемент; двойная косая черта означает любого родителя
  • [contains(text(),$term)] - это предикат, соответствующий тексту
  • text() - это функция, которая получает текст элемента
  • $term - переменная; это может быть использовано для разрешения термина «java» через переменную resolver; преобразователь предпочтительнее конкатенации строк для предотвращения атак внедрения (аналогично проблемам внедрения SQL)
  • contains(arg1,arg2) - это функция, которая возвращает true, если arg1 содержит arg2

XPathConstants.NODE указывает API выбрать один узел; Вы можете использовать NODESET, чтобы получить все совпадения как NodeList.

...