2016-07-07 4 views
1

Мне нужна помощь с выражением XPath, которое соответствует всем элементам, где бы они ни находились. Этовыражение XPath, чтобы найти все существующие элементы

for (String tag:tags) { 
    StringBuffer expression = new StringBuffer("//" + tag + "/text()");} 
} 

Это соответствует всем, но теперь мне нужно применить исправление для возможного внедрения XPath. Поэтому я пытаюсь реализовать это с помощью XPathVarableResolver.

for (String tag:tags) { 
    MapVariableResolver vr = new MapVariableResolver(); 
    vr.addVariable(new QName(null, "tag"), tag); 
    xPath.setXPathVariableResolver(vr); 
    StringBuffer expression = new StringBuffer("//$tag/text()");} 
    XPathExpression expr = xPath.compile(expression.toString()); 
    nodeList = (NodeList) expr.evaluate(doc,XPathConstants.NODESET); 
} 

Но я получаю исключение из исключения XPath. javax.xml.transform.TransformerException: шаг объявления ожидался после токена '/' или '//'.

StringBuffer expression = new StringBuffer ("// $ tag/text()");

что было бы правильным выражением здесь? "// $ tag/text()" ??

ответ

1

Предполагая, что $tag хранится в переменной XPath строки, вы можете попытаться отфильтровать элемент путем сравнения его имя следующим образом:

StringBuffer expression = new StringBuffer("//*[name()=$tag]/text()"); 
+0

Спасибо так много. Это то, что я искал. – Qajussi

+0

Можете ли вы объяснить, для чего? – Qajussi

+0

также, если я хочу сделать что-то вроде этого (// tag1/tag2/text()), мне нужно * до того, как tag2 вот так // * [name() = $ tag1]/* [nam() = $ tag2 ]/текст() – Qajussi

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