Dom4j分离节点,Jython

时间:2009-05-14 10:57:48

标签: xpath jython dom4j detach

我正在使用Dom4j来分离节点,如下所示:

<div name="divName">
    Some Text Here
    <span>Some Text Here</span>
</div>

我按名称选择div节点,然后使用detach方法将其删除:

xpathValue = "//*[contains(@name, 'divName')]"
xpath = dom.createXPath(xpathValue)
    if xpath != None:
        nodes = xpath.selectNodes(dom)
        if len(nodes) > 0:
            for node in nodes:
                node.detach()

这似乎删除div很好,我注意到它也删除了该div中的元素和文本。我正在寻找的是删除div而不删除div中的元素和文本,导致这个:

Some Text Here
<span>Some Text Here</span>

有可能用dom4j实现这个目标吗?如果没有关于如何解决这个问题的任何建议?

干杯

EEF

更新

@alamar

我已经获得了我想要的东西,通过你的代码和编辑它,这就是我想出的:

   xpathValue = "//*[contains(@name, 'divName')]"
   xpath = dom.createXPath(xpathValue)
    if xpath != None:
        nodes = xpath.selectNodes(dom)
        if len(nodes) > 0:
            for node in nodes:
                parent = node.getParent()
                nodeContents = node.content()
                    if len(nodeContents) > 0:
                        for subNode in nodeContents:
                            parent.add(subNode.clone().detach())
            node.detach()

这似乎有效,但在以下情况下将节点添加到父节点的末尾:

<div name="parent">
    <div name="divName">
        Some Text Here
        <span>Some Text Here</span>
    </div>
    <div name="keep"></div>
</div>

结果如下:

<div name="parent">
    <div name="keep"></div>
    Some Text Here
    <span>Some Text Here</span>
</div>

我试图找出如何让被删除节点的内容保持在其原始位置,在名为“keep”的div之前,而不是在名为“keep”的div之后添加。我尝试了一些但似乎无法实现这一点,任何人都可以帮忙吗?

EEF

3 个答案:

答案 0 :(得分:1)

如果你想保持元素的顺序,你应该真正问parent content()。 在content(由父元素支持的List)集合中,您应找到div并将其替换为该div的content()

坦率地说,我不记得在python中这样做的惯用方法。

可能

if xpath != None:
    nodes = xpath.selectNodes(dom)
    if len(nodes) > 0:
        for node in nodes:
            parent = node.getParent()
            index = parent.indexOf(node)
            siblings = parent.content()
            nodeContents = node.content()
                if len(nodeContents) > 0:
                    for subNode in nodeContents:
                        siblings.add(subNode.clone().detach(), index++)
        node.detach()

答案 1 :(得分:0)

尝试:

if xpath != None:
    nodes = xpath.selectNodes(dom)
    if len(nodes) > 0:
        for div in nodes:
            parent = div.getParent()
            div.detach()
            for(child in node.content())
                child.detach()
                parent.add(child)

我相信它会成功。

即。在分离每个div之后,你应该将每个div的孩子重新连接到div的父母身上。

答案 2 :(得分:0)

我遇到了类似的问题并使用以下功能解决了它(对我来说很好)

它在做什么:它将简单地删除该父标记,并将元素内的每个元素和节点包含在该位置的父元素中。

   private void _replaceTagByContent(Element element) {
        Element parent = element.getParent();
        List elements = parent.elements();
        int insertPosition = elements.indexOf(element);

        // add them all to the parent again
        for (int i = 0, size = elements.size(); i < size; i++) {
            Node node = (Node) elements.get(i);
            if (i == insertPosition) {

                // if we are here, then this has to be an element, since
                // wo do only replace elements ...

                for (int j = element.nodeCount() - 1; j >= 0; j--) {
                    Node theNode = element.node(j);
                    theNode.detach();
                    elements.add(i, theNode);
                }

                // finally remove this node
                elements.remove(node);
            }
        }
    }

享受cnsntrk