-1

LibXML2 の 'Not Found Error' をデバッグするには? この関数 (ここに投稿するために簡略化/書き直されています) は、ノードのリストをタグでグループ化します。

  function groupList(DOMNodeList &$list,$tag,&$dom) {
        $list = iterator_to_array($list); // to save itens
        $T = $dom->createElement($tag);
        $N = count($list);
        if ($N && $list[0]->nodeType==1) {
              for($i=0; $i<$N; $i++) 
                    $T->appendChild( $list[$i] );
                   // here print $dom->saveXML($lista[0]) shows the expected XML.
              $list[0]->parentNode->replaceChild($T, $list[0]);
    //Fatal error:  ... 'DOMException' with message 'Hierarchy Request Error'
    // also error with $dom->documentElement->replaceChild( $T, $list[0] );  
    // where error is: ... 'DOMException' with message 'Not Found Error'
              for($i=1; $i<$N; $i++)
                    $list[$i]->parentNode->removeChild($list[$i]);
        }//if
        return $N;
  }//func

Edit1:$list[0]->parentNode->replaceChild($T, $list[0]);エラーは「Hierarchy Request Error」です。デバッグprint $dom->saveXML($list[0])は予想される XML を示します。


Edit2: INPUT と OUTPUT による説明

入力

  <root><b>10</b><a/><a>1</a><b>20</b><a>2</a></root>

期待される出力groupList($dom->getElementsByTagName('a'),'G')

  <root><b>10</b>
     <G><a/><a>1</a><a>2</a></G>
  <b>20</b></root>
4

1 に答える 1

0

バグ (?) でした... 解決策: 同じアルゴリズムを使用するには、ノードを複製またはインポートする必要があります。

  function groupList(DOMNodeList &$list,$tag,&$dom) {
        $list = iterator_to_array($list); // to save itens
        $d2 = new DOMDocument;
        $T = $d2->createElement($tag);
        $N = count($list);
        if ($N && $list[0]->nodeType==1) {
              for($i=0; $i<$N; $i++) 
                  $T->appendChild( $d2->importNode($list[$i], true) );
              $dom->documentElement->replaceChild(
                    $dom->importNode($T, true),   $list[0]
              );
              for($i=1; $i<$N; $i++)
                    $list[$i]->parentNode->removeChild($list[$i]);
        }//if
        return $N;
  }//func

しかし、なぜ (!)、iterator_to_array なしの基本的なアルゴリズムが機能するのか (!) がわかりません...まあ、ほぼ正常に機能します (返された $dom のエラー)、

 function groupList2(DOMNodeList &$list,$tag,&$dom) {
       $n = $list->length;
       if ($n && $list->item(0)->nodeType==1) {
          $T = $dom->createElement($tag);
              for($i=0; $i<$n; $i++) 
                 $T->appendChild( clone $list->item($i) );
              $dom->documentElement->replaceChild( $T,$list->item(0) );
              for($i=0; $i<$n; $i++)
             if ($i) $list->item($i)->parentNode->removeChild($list->item($i));
        }//if
        return $n;
  }//func

戻り値

  <root><b>10</b><G><a/><a>2</a></G><b>20</b><a>2</a></root>
于 2013-11-01T20:21:19.160 に答える