我可以使用根相对XPath表达式来获取克隆节点中的节点吗?

时间:2015-06-08 19:58:06

标签: java xml xpath

考虑这段代码,我们在其中:

1)构建一个简单的XML文档;

2)克隆其中一个节点;

3)使用xpath搜索节点a中的属性in

@Test
public void lookupInClonedNode() throws Exception {
    String xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><out a='1'><in a='2'/></out>";
    Document document = DocumentBuilderFactory
            .newInstance()
            .newDocumentBuilder()
            .parse(new InputSource(new StringReader(xmlString)));
    Node cloneOfOut = document.getFirstChild().cloneNode(true);
    String query = "//in/@a";
    Node attributeA = (Node) XPathFactory
            .newInstance()
            .newXPath()
            .evaluate(
                    query,
                    cloneOfOut,
                    XPathConstants.NODE
            );
    assertNotNull(attributeA);
}

此测试失败。但是,如果您不克隆节点,但使用现有节点,则它会通过。替换行:

Node cloneOfOut = document.getFirstChild().cloneNode(true);

行:

Node cloneOfOut = document.getFirstChild();

查看测试通过。

我有两个问题:

  1. 为什么会发生这种情况?我希望测试能够在克隆节点的情况下通过。
  2. 如果我的方法使用克隆节点,我可以用它来执行根相对xpath查找(即以///开头的那个?)

1 个答案:

答案 0 :(得分:1)

  1. 如果我支持观察到的行为,我会引用XPath规范:
  2.   

    A /本身选择包含上下文节点的文档的根节点。

    但是在DOM中,克隆节点没有父节点,因此不包含在任何文档中。

    1. 您可以测试节点是否具有父父节点。如果没有,您可以创建一个新的Document并将节点导入其中。