我是xpath
的初学者,并希望仅将字符串查询中的属性和元素名称转换为大写。
此查询将传递给Xpath
。evaluate函数以获取此字符串指定的节点。
我有一个java函数,从文档中我得到一个XPath
。
String path= document.getXPath();
从此我使用xpath
找到此javax.xml.xpath.XPath.evaluate(path,node,XPathConstants.NODESET);
引用的节点
我的目标是将返回的字符串“path”转换为仅用于元素和属性的大写字母。
例如,路径可以是
/abc/*[@xyz='123'/wer[1][ancestor-or-self::uio]
其中abc,wer和uio是元素名称,xyz是属性名称。
我只需要将这些转换为大写,因为在xpath将搜索的文档中,这些都是大写的。
由于xpath区分大小写,我不希望xpath关键字/函数如“ancestor-or-self”,“not”,“contains”等转换为大写。
转换后,路径应为 -
/ABC/*[@XYZ='123'/WER[1][ancestor-or-self::UIO]
任何人都可以向我提供指示,如何实现这一目标。
由于
答案 0 :(得分:0)
您可以在此处使用正则表达式:
public static String upperCaseNodes(String xpath) {
String ret = xpath;
Pattern rP = Pattern.compile("(?i)(?<=/|@|::)([a-z\\d-_]+)");
Matcher mP = rP.matcher(before);
while (mP.find()) {
String match = mP.group(1);
ret = ret.replaceAll(match, match.toUpperCase());
}
return ret;
}
System.out.println(upperCaseNodes("/abc/*[@xyz='123'/wer[1][ancestor-or-self::uio]"));
/ABC/*[@XYZ='123'/WER[1][ancestor-or-self::UIO]
答案 1 :(得分:0)
你是怎么陷入这个烂摊子的?为什么XPath表达式在错误的情况下?
将文档更改为小写可能比将XPath表达式更改为大写更容易。
100%正确的解决方案需要完全解析XPath表达式,您可以通过查找开源XPath解析器并将其合并到您的应用程序中来实现。
但是,通过转换与某些例外列表中的单词不匹配的所有“单词”(字母和数字序列),您可能能够获得足够接近正确的解决方案,其中例外列表将包括轴名称,“and”和“or”之类的运算符,以及“contains”等系统函数的名称。