-->

XPath的正常化空间()返回标准化字符串序列(XPath normalize-space() to

2019-09-19 05:21发布

我需要使用XPath函数归一化空间()来归我想从一个XHTML文档提取文本: http://test.anahnarciso.com/clean_bigbook_0.html

我使用下面的表达式:

//*[@slot="address"]/normalize-space(.)

这完全在Qizx工作室,我用它来测试XPath表达式的工具。

    let $doc := doc('http://test.anahnarciso.com/clean_bigbook_0.html')
    return $doc//*[@slot="address"]/normalize-space(.)

这个简单的查询返回的序列xs:string

144 Hempstead Tpke
403 West St
880 Old Country Rd
8412 164th St
8412 164th St
1 Irving Pl
1622 McDonald Ave
255 Conklin Ave
22011 Hempstead Ave
7909 Queens Blvd
11820 Queens Blvd
1027 Atlantic Ave
1068 Utica Ave
1002 Clintonville St
1002 Clintonville St
1156 Hempstead Tpke
Route 49
10007 Rockaway Blvd
12694 Willets Point Blvd
343 James St

现在,我想用我的Java代码前面的表达。

String exp = "//*[@slot=\"address"\"]/normalize-space(.)";
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(exp);
Object result = expr.evaluate(doc, XPathConstants.NODESET);

但最后一行抛出一个异常:

Cannot convert XPath value to Java object: required class is org.w3c.dom.NodeList; supplied value has type xs:string

Obvsiously,我应该改变XPathConstants.NODESET的东西; 我试图XPathConstants.STRING但它只返回序列的第一个元素。

我怎样才能获得像一个字符串数组?

提前致谢。

Answer 1:

表达式工作在XPath 2.0中,但是在XPath中1.0(这是在Java中使用)非法-它应该是normalize-space(//*[@slot='address'])

不管怎样,在XPath 1.0中,当normalize-space()被调用上的节点集,只有第一个节点(按文档顺序)被取。

为了做你想做的事,你需要使用的XPath 2.0兼容的解析器,或遍历结果节点集,并呼吁normalize-space()的每个节点上:

XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr;

String select = "//*[@slot='address']";
expr = xpath.compile(select);
NodeList result = (NodeList)expr.evaluate(input, XPathConstants.NODESET);

String normalize = "normalize-space(.)";
expr = xpath.compile(normalize);

int length = result.getLength();
for (int i = 0; i < length; i++) {
    System.out.println(expr.evaluate(result.item(i), XPathConstants.STRING));
}

...究竟输出的给定输出。



Answer 2:

这取决于你使用的是什么版本的XPath。 看看这个帖子,希望它会回答你的问题: 是否有可能申请正常化空间的所有节点XPath表达式查找? 祝好运。



Answer 3:

表达

//*[@slot="address"]/normalize-space(.)

在语法上是合法的(和实际有用的)的XPath 2.0表达式。

相同的表达不在的XPath 1.0语法有效的 - 它是不允许的位置步骤是一个函数调用。

事实上,这是不可能写出一个 XPath 1.0表达式,其评价是通缉字符串集合的结果。

你需要在你的程序中使用实现的XPath 2.0产品 - 如撒克逊9.x的



Answer 4:

如你所指出的,中的XPath 2.0表达式//*[@slot="address"]/normalize-space(.)返回字符串的序列。 该返回类型不被支持JAXP XPathConstants类,因为JAXP接口并没有设计为支持的XPath 2.0。

这使你有两个选择:

  1. 使用具有XPath 2.0处理器本机接口,用于XPath 2.0中或可序列转换成由JAXP支持的返回类型
  2. 仅使用的XPath 1.0表达式。 例如,你的情况,你可以简单地选择目标节点:

     //*[@slot="address"] 

    然后进行迭代所得到的节点集,收集的结果到一个数组或List

请注意,您使用的是计算表达式之处理和你使用启动评估接口之间的区别是很重要的。



文章来源: XPath normalize-space() to return a sequence of normalized strings
标签: java xml xpath