我尝试只获取属性的一部分(也可能是元素的一部分),但到目前为止还没有运气。我得到的例外是“无效的XPath表达式:// @ att / tokenize(。,'')[。] [position()= 1]预期的节点类型”。我正在使用dom4j 1.6.1。
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.XPath;
import org.dom4j.xpath.DefaultXPath;
public class TestXPathString {
/**
* @param args
* @throws DocumentException
*/
public static void main(String[] args) throws DocumentException {
Document doc = DocumentHelper
.parseText("<x><y att='I just need the first word' /></x>");
XPath xpath = new DefaultXPath("//@att/tokenize(., ' ')[.][position() = 1]");
Object result = xpath.evaluate(doc);
System.out.printf("Type: %s, Value: %s\n", result.getClass()
.getSimpleName(), result);
}
}
不适用于
doc.selectObject("//@att/substring-before(., ' ')");
或者
有什么想法吗?
答案 0 :(得分:1)
在轴步骤中应用函数是XPath 2.0的一项功能; Java(和dom4j)仅支持XPath 1.0。你不能这样做。
如果您只想要一个结果,请使用substring-before(//@att, ' ')
。否则,将整个属性值传递给Java并在XPath外部执行字符串操作。
您可以考虑使用Java API插入更强大的XPath / XQuery引擎,如Saxon,BaseX或其他原生XML数据库。
答案 1 :(得分:0)
使用
//*/substring-before(@att, ' ')
答案 2 :(得分:0)
您可以使用Saxon XPath 2.0引擎查询DOM4J。那么你的表达就可以了。