4

我正在编写一些代码用于导致问题的 Xpath 查询。我正在尝试从列表中读取一个随机名称,但是 float (x) 偶尔会返回指数符号。

Random r = new Random();
float x = r.nextFloat();

final String expression = "(/list/name[@minLevel<=" + minLevel + "])" +
    "[(" + x + " * count(/list/name[@minLevel<=" + minLevel + "])) +1]";

每隔一段时间,表达式就等于:

(/name/list[@minLevel<=11])[(5.478859E-4 * count(/name/list[@minLevel<=11])) +1]

显然 xpath 不使用指数符号进行数学运算,因为我收到了这个错误:

javax.xml.transform.TransformerException: 5.478859E-4 could not be formatted to a number!

任何有关如何防止这种情况的帮助将不胜感激。

4

3 回答 3

5

要转换浮点数,您可以使用String.format()with%f作为格式说明符。这永远不会使用科学计数法。

String.format("%f", x)

这也使您可以根据需要灵活地调整宽度和精度。

于 2013-01-02T17:25:07.103 回答
3

不要x直接插入到字符串 ( ... + x + ..) 中,而是使用这个:

... + String.format("%f", x) + ...

您还可以使用转换上的修饰符来控制结果的精度和宽度。请参阅格式化文档

于 2013-01-02T17:26:08.550 回答
1

通过字符串连接构造 XPath 表达式通常不是最好的方法。除了注入攻击的风险之外,这意味着您无法编译一次表达式并使用不同的参数重复使用它。

相反,编译表达式

(/list/name[@minLevel<=$minLevel])[($x * count(/list/name[@minLevel<=$minLevel])) +1]

然后在执行时提供参数 $x 和 $minLevel 的值。

于 2013-01-02T18:17:36.437 回答