Dom4j отсоединить узел, Jython - PullRequest
1 голос
/ 14 мая 2009

Я использую 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

Обновление:

@ Аламар

Я достиг того, чего хотел, взяв ваш код и немного его отредактировав, и вот что я придумал:

   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>

Я пытаюсь выяснить, как сделать так, чтобы содержимое удаленного узла оставалось в исходном положении до того, как div с именем «keep», вместо добавления после div с именем «keep». Я попробовал кое-что, но не могу этого достичь, кто-нибудь может помочь?

Eef

Ответы [ 3 ]

1 голос
/ 14 мая 2009

Если вы хотите сохранить порядок элементов, вы должны спросить parent о content(). В этой коллекции content (которая является списком, поддерживаемым родительским элементом) вы должны найти свой div и заменить его на content().

этого элемента div.

Честно говоря, я не помню идиоматического способа сделать это на 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()
0 голосов
/ 27 мая 2013

У меня была похожая проблема, и я решил ее с помощью следующей функции (у меня отлично работает)

Что он делает: он просто удаляет этот родительский тег и включает каждый элемент и узел внутри элемента в родительский элемент в этой позиции.

   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

0 голосов
/ 14 мая 2009

Попробуйте:

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.

...