1

以下のように、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でこれを達成することは可能ですか? これについての提案がない場合はどうすればよいですか?

乾杯

イーフ

アップデート:

@アラマー

あなたのコードを取得して少し編集することで、私が望んでいたことを達成しました。これが私が思いついたものです。

   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」という名前のdivの前に、削除されたノードの内容を元の位置にとどめる方法を見つけようとしています。私はいくつかのことを試しましたが、これを達成できないようです。誰か助けてもらえますか?

イーフ

4

3 に答える 3

1

要素の順序を維持したい場合は、実際parentにそのcontent(). そのcontent(親要素に裏打ちされたリストである)コレクションで、あなたを見つけてdiv、その div に置き換える必要があります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()
于 2009-05-14T13:43:08.843 に答える
0

試す:

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 の親に再接続する必要があります。

于 2009-05-14T11:14:17.860 に答える
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を楽しむ

于 2013-05-27T05:59:57.587 に答える