1

我正在使用 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 实现这一目标?如果没有关于如何解决这个问题的任何建议?

干杯

伊夫

更新:

@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 之后添加。我已经尝试了一些东西,但似乎无法做到这一点,有人可以帮忙吗?

伊夫

4

3 回答 3

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()
于 2009-05-14T13:43:08.843 回答
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 的父元素中。

于 2009-05-14T11:14:17.860 回答
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

于 2013-05-27T05:59:57.587 回答