任何人都可以提供XPath表达式,选择所有具有明确'xmlns'属性的节点,例如<html xmlns="http://www.w3.org/1999/xhtml">?//*[@xmlns]不起作用,因为(事实证明)XPath不会将xmlns视为属性.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<title>?????????? ?? ??????, ??????</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="pragma" content="no-cache"/>
.......
Run Code Online (Sandbox Code Playgroud)
我这里只需要'html'节点.
技术上正确的答案是它......
不可能.您需要区分源文本表示的抽象文档和实际源文本本身.XPath的操作上的抽象,而不是源文本,以及位置的的xmlns伪属性仅在后者有关.
然而...
您可以使用以下XPath 2.0表达式来伪造它:
//*[not(namespace-uri()=ancestor::*/namespace-uri())]
Run Code Online (Sandbox Code Playgroud)
这将选择在同一名称空间中没有祖先的任何元素,理论上这意味着它选择声明名称空间的所有元素.但是,它不会捕获重新声明的名称空间.例如,请考虑以下文档:
<html xmlns="http://www.w3.org/1999/xhtml">
<head/>
<body>
<p xmlns="http://something">
<p xmlns="http://something"/>
</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
上面的表达式选择html元素和第一个p.第二个p在同一名称空间中有一个祖先,所以它没有被选中,即使它指定了一个xmlns.
| 归档时间: |
|
| 查看次数: |
3821 次 |
| 最近记录: |