Рассмотрите возможность использования 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
.