如何将java中字符串xpath查询中的元素和属性转换为大写

时间:2014-02-04 10:00:06

标签: java xpath

我是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]

任何人都可以向我提供指示,如何实现这一目标。

由于

2 个答案:

答案 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”等系统函数的名称。