dom4j 노드, Jython Detach Detach
문제
아래와 같이 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를 즐기십시오