首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dom4j分离节点

Dom4j分离节点
EN

Stack Overflow用户
提问于 2009-05-14 10:57:47
回答 3查看 2.2K关注 0票数 1

我使用Dom4j来分离一个节点,如下所示:

代码语言:javascript
复制
<div name="divName">
    Some Text Here
    <span>Some Text Here</span>
</div>

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

代码语言:javascript
复制
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,结果如下:

代码语言:javascript
复制
Some Text Here
<span>Some Text Here</span>

是否有可能通过dom4j实现这一目标?如果没有建议的话,怎么做呢?

干杯

Eef

更新:

@alamar

我已经实现了我想要的,通过接受您的代码并对其进行编辑,这就是我想出的:

代码语言:javascript
复制
   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()

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

代码语言:javascript
复制
<div name="parent">
    <div name="divName">
        Some Text Here
        <span>Some Text Here</span>
    </div>
    <div name="keep"></div>
</div>

其结果是:

代码语言:javascript
复制
<div name="parent">
    <div name="keep"></div>
    Some Text Here
    <span>Some Text Here</span>
</div>

我试图弄清楚如何使删除的节点的内容保持在原来的位置,而不是在名为“removed”的div之后添加,而不是在名为“added”的div之后添加。我试过几件事,但似乎做不到,有人能帮忙吗?

Eef

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-14 13:43:08

如果您想要保持元素的顺序,就应该向parent请求它的content()。在这个content (它是一个由父元素支持的列表)集合中,您应该找到您的div并将其替换为div的content()

坦率地说,我不记得在python中用什么惯用的方法来做到这一点。

很可能

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-05-14 11:14:17

尝试:

代码语言:javascript
复制
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的父母身上。

票数 0
EN

Stack Overflow用户

发布于 2013-05-27 05:59:57

我有一个类似的问题,并通过以下功能解决了这个问题(对我来说很好)

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

代码语言:javascript
复制
   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);
            }
        }
    }

尽情享受

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/862709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档