2011-09-16 80 views
2

我試圖將新節點插入到XML文檔中。我使用simpleXML進行大部分解析,但對於這部分,我需要使用DOM。這是我使用,使另外使用DOM插入新行

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); 
    } 
} 

,並要求它像這樣的功能:

$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); 

我的問題是,它的目標後立即插入新的節點,而不是一個新的行,以便生成的XML看起來是這樣的:

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

當我想它看起來就像這樣:

<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

謝謝你的提示的對象。我認爲這是正確的軌道,但在做出這一改變的那一刻,我收到了以下消息: '調用未定義的方法DOMElement :: createTextNode()' – Mulberry

+0

try $ target_dom-> ownerDocument-> createTextNode(「\ n」 ),因爲createTextNode是一個DomDocument方法(我現在手邊沒有php,不能自己試試) – Eineki

+0

你搖滾,修復它。我對DOM還是一個新手,但我應該抓住這一點。再次感謝! – Mulberry

0

試着改變你的方法調用此:

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

...與preserveWhiteSpace = true;

+0

謝謝,不幸的是,它給了我這個錯誤: 參數2,以simplexml_insert_after()必須是一流的SimpleXMLElement – Mulberry