2011-09-16 19 views
2

新しいノードをXMLドキュメントに挿入しようとしています。私は構文解析のほとんどのためにsimpleXMLを使用していますが、私はDOMを使用する必要があります。DOMを使用して新しい行を挿入する

$meta2 = new SimpleXMLElement("<meta/>"); 
$meta2->addAttribute('name', 'subject'); 
$meta2->addAttribute('value', $doc_id); 
$target = current($my_xml->xpath('//meta[last()]')); 
simplexml_insert_after($my_xml, $meta2, $target); 

私の問題は、すぐにターゲットした後ではなく、新規にその新しいノードを挿入することである:これは私が加え

function simplexml_insert_after(SimpleXMLElement $sxe, SimpleXMLElement $insert, SimpleXMLElement $target) 
{ 
    $target_dom = dom_import_simplexml($target); 
    $target_dom->formatOutput = true; 
    $target_dom->preserveWhiteSpace = false; 
    $insert_dom = $target_dom->ownerDocument->importNode(dom_import_simplexml($insert), true); 
    if ($target_dom->nextSibling) { 
     return $target_dom->parentNode->insertBefore($insert_dom, $target_dom->nextSibling); 
    } else { 
     return $target_dom->parentNode->appendChild($insert_dom); 
    } 
} 

そして、このようにそれを呼び出す作るために使用している機能です結果のXMLので、行は次のようになります。

<meta content="a" name="ap-category"/> 
<meta content="bx" name="ap-format"/><meta name="subject" value="urn:blah"/> 

私はこのように見えるし、それを希望する場合

私はpreserveWhiteSpaceをtrueに変更しようとしましたが、それは役に立ちませんでした。そのノードを挿入する前に新しい行を追加するにはどうすればよいですか?

function simplexml_insert_after(SimpleXMLElement $sxe, SimpleXMLElement $insert,SimpleXMLElement $target) 
{ 
    $target_dom = dom_import_simplexml($target); 
    $target_dom->formatOutput = true; 
    $target_dom->preserveWhiteSpace = false; 
    $insert_dom = $target_dom->ownerDocument->importNode(dom_import_simplexml($insert), true); 
    if ($target_dom->nextSibling) { 
      $result = $target_dom->parentNode->insertBefore($insert_dom, $target_dom->nextSibling); 
      $target_dom->parentNode->insertBefore($target_dom->ownerDocument->createTextNode("\n"), $result); 
      return $result 
    } else { 
      return $target_dom->parentNode->appendChild($insert_dom); 
    } 
} 

答えて

4

に挿入しようとここ が働いていた修正がある

編集挿入する要素の直前にtextnodeを挿入します。次のようになります。

あなたの提案のためのの
function simplexml_insert_after(SimpleXMLElement $sxe, 
           SimpleXMLElement $insert, 
           SimpleXMLElement $target) 
{ 
    $target_dom = dom_import_simplexml($target); 
    $target_dom->formatOutput = true; 
    $target_dom->preserveWhiteSpace = false; 

    $document = $target_dom->ownerDocument; 
    $insert_dom = $document->importNode(dom_import_simplexml($insert), true); 

    $parentNode = $target_dom->parentNode; 
    if ($target_dom->nextSibling) { 
     $result = $parentNode->insertBefore($insert_dom, $target_dom->nextSibling); 
     $parentNode->insertBefore($document->createTextNode("\n"), $result); 
     return $result 
    } else { 
     return $parentNode->appendChild($insert_dom); 
    } 
} 
+0

感謝SimpleXMLElementクラスのオブジェクトでなければなりません。 'DOMElement :: createTextNode()'を呼び出す – Mulberry

+0

$ target_dom-> ownerDocument-> createTextNode( "\ n")を試してみてください。これは正しいトラックにあると思いますが、 )、createTextNodeはDomDocumentメソッドです(私は今のところPHPを手に入れておらず、自分で試すことはできません) – Eineki

+0

あなたはそれを修正しました。私はまだDOMの新しいですが、私はそれをキャッチしていたはずです。再度、感謝します! – Mulberry

0

をこれにあなたのメソッド呼び出しを変更してみてください:

simplexml_insert_after($my_xml, "\n" . $meta2, $target); 

... preserveWhiteSpace = true;

+0

おかげで、残念ながら、それは私に、このエラーを与える:(simplexml_insert_afterに渡さ 引数2)は、先端のため – Mulberry

関連する問題