문제

아래와 같이 DOM4J를 사용하여 노드를 분리합니다.

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

이름별로 div 노드를 선택한 다음 분리 메소드를 사용하여 제거합니다.

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 fine을 제거하는 것처럼 보이며 해당 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"라는 이름의 "Keep"이라는 이름을 붙이는 방법을 알아 내려고 노력하고 있습니다. 나는 몇 가지 시도를 시도했지만 이것을 달성하는 것처럼 보일 수는 없습니다. 누구든지 도울 수 있습니까?

EEF

도움이 되었습니까?

해결책

요소의 순서를 유지하려면 정말로 물어봐야합니다. parent 그것을 위해 content(). 그것에 content (부모 요소에 의해 뒷받침 된 목록) 컬렉션은 귀하의 div 그리고 그것을 그 div로 바꾸십시오 content().

솔직히 파이썬에서 그렇게하는 관용적 인 방법을 기억하지 못합니다.

아마

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()

다른 팁

노력하다:

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의 부모로 재개해야합니다.

나는 비슷한 문제가 있었고 다음 기능으로 해결했습니다 (나에게 잘 작동합니다)

무엇을하고 있습니까 : 그것은 단순히 부모 태그를 제거하고 해당 위치의 부모에게 요소 내부의 모든 요소와 노드를 포함합니다.

   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를 즐기십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top