2009-05-14 11 views
1

Я использую dom4j для отсоединения узла, как показано ниже:dom4j отсоединение узла, Jython

<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 отлично, я заметил, что он также удаляет элементы и текст внутри этого div. То, что я ищу для того чтобы достигнуть является удаление DIV без удаления элементов и текста внутри DIV, в результате чего в этом:

Some Text Here 
<span>Some Text Here</span> 

Можно ли для того чтобы достигнуть этого с dom4j? Если не какие-либо предложения о том, как это сделать?

Приветствия

Eef

Update:

@alamar

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

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 будет иметь имя «сохранить», вместо добавления после div с именем «держать». Я пробовал кое-что, но не могу показаться, это может помочь, может ли кто-нибудь помочь?

Eef

ответ

1

Если вы хотите сохранить порядок элементов, вы должны действительно спросить parent за его content(). В этом content (который представляет собой список, поддерживаемый родительским элементом), вы должны найти свой div и заменить его на 0 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() 
0

Try:

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) 

Я считаю, что это будет делать трюк.

I.e. после отсоединения каждого div, вы должны присоединить каждый ребенок div в родительский div.

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