抓取不是其他节点后代的节点,不包括当前上下文

时间:2011-04-10 21:26:36

标签: xml dom xpath nodes

所以,我不知道如何真正说出这个问题。我想要一个节点列表,只选择一个节点,而不是嵌套节点。例如:

<root>
    <my_element>
        <my_element>
            Some Text
        </my_element>
    </my_element>
</root>

我知道我已经可以使用这个xpath完成我想要的一些事情了:

Context: /
xPath: descendant::my_element[not(ancestor::my_element)]

哪会返回此结果集:

<root>
    [<my_element>]
        <my_element>
            Some Text
        </my_element>
    [</my_element>]
</root>

这就是我想要的预期行为。但我希望能够将上下文更改为:

/my_element

获得此结果集:

<root>
    <my_element>
        [<my_element>]
            Some Text
        [</my_element>]
    </my_element>
</root>

我一直在努力查看xPath文档,但我还没有提出任何想法。在这里有人可以提供一些见解吗?

谢谢!

  • 编辑 - 我希望能够选择一个my_element后代,它不是my_element的祖先,不包括上下文节点。

  • 再次编辑 - 进一步解释。

我希望有一个xpath查询,只要节点不是my_element的子节点,就会选择my_element的节点。但是,如果xpath上下文设置为my_element节点,那么我不希望该节点计入表达式。因此,xpath将匹配下一个my_element节点,即使它实际上是my_element的子节点。

  • 再次编辑 -

以下是一些例子。

<root>
    <a>
        <a>
            <b>
                <a>
                    Hello!
                </a>
            </b>
            <a>
                <b>
                    Hello Again
                    <a>
                        Sub
                    </a>
                </b>
            </a>
        </a>
    </a>
</root>

Context: /root/
Desire: Want to grab all A nodes, so long as they aren't a descendant of A

Result:
<root> == Context
    [<a>]
        <a>
            <b>
                <a>
                    Hello!
                </a>
            </b>
            <a>
                <b>
                    Hello Again
                    <a>
                        Sub
                    </a>
                </b>
            </a>
        </a>
    [</a>]
</root>

Context: /root/a/
Desire: Want to grab all A nodes, so long as they aren't a descendant of A, not including the context /root/a/

Result:
<root>
    <a> == Context
        [<a>]
            <b>
                <a>
                    Hello!
                </a>
            </b>
            <a>
                <b>
                    Hello Again
                    <a>
                        Sub
                    </a>
                </b>
            </a>
        [</a>]
    </a>
</root>

Context: /root/a/a/
Desire: Want to grab all A nodes, so long as they aren't a descendant of A, not including the context /root/a/a/

Result:
<root>
    <a>
        <a> == Context
            <b>
                [<a>]
                    Hello!
                [</a>]
            </b>
            [<a>]
                <b>
                    Hello Again
                    <a>
                        Sub
                    </a>
                </b>
            [</a>]
        </a>
    </a>
</root>

Context: /root/a/a/a/
Desire: Want to grab all A nodes, so long as they aren't a descendant of A, not including the context /root/a/a/a/

Result:
<root>
    <a>
        <a>
            <b>
                <a>
                    Hello!
                </a>
            </b>
            <a> == Context
                <b>
                    Hello Again
                    [<a>]
                        Sub
                    [</a>]
                </b>
            </a>
        </a>
    </a>
</root>

我希望这能使我的欲望更加清晰。谢谢大家的尝试!

2 个答案:

答案 0 :(得分:0)

使用

//my_element[not(.//my_element)]

这将选择名为my_element且没有任何my_element后代的所有元素。

答案 1 :(得分:0)

我认为你可能会陷入一个共同陷阱。数据上的XPath表达式/ root / my_element将只选择一个元素 - 最外层的my_element节点。但是该节点仍然依附于其父母,兄弟姐妹和孩子。当您显示选择的结果时,节点通常会与其子节点(实际上是所有后代)一起显示 - 不是因为XPath选择了子节点,而是因为这是显示所选单节点的友好方式。

另一方面,我再次阅读了这个问题,我可能错了 - 我从你用来表示你的XPath表达结果的特殊符号中猜到了。

表达式/ my_element只有在其父元素是树根的文档节点时才会选择my_element,无论您的上下文节点是什么,对于您的输入都不会如此。当然,您可以将以my_element为根的子树复制到一个新文档中,在这种情况下,该表达式将起作用。