2013-03-19 45 views
0

我想一個子元素追加到XML節點無法建立在XML節點空值

$rel->appendChild($domtree->createElement('title',NULL)); 

我希望它這樣

<title></title> 

輸出,但我得到這個代替

<title/> 

如何用空值創建它?

+0

誰問這個問題的人做同樣的事情,你想要做的:[http://stackoverflow.com/questions/4516657/how-do-i-create-an-empty-blank-simplexmlelement-in-php](http://stackoverflow.com/questions/4516657/如何做,我創建一個空的空白Simplexmlelement在PHP) – Steven 2013-03-19 15:31:00

+0

所以,我得到了答案... – 2013-03-19 15:40:02

回答

2

你需要明確添加一個空的文本節點:

$title = $domtree->createElement('title'); 
$title->appendChild($domtree->createTextNode('')); 
$rel->appendChild($title); 

的第二個參數createElement()是非標準的,我個人不使用它,因爲它可以產生像這樣稍微直觀行爲。

在我看來,你應該總是明確地創建文本節點。這樣做的另一個原因是文本節點會自動正確地處理轉義,與需要手動轉義文本數據的非標準第二個參數不同。

+0

哇,這是gr吃,謝謝... – 2013-03-19 15:37:17

0

以供將來參考,這裏是如何,你可以很容易地從陣列構建您的XML(包括空元素):

class Test { 
    public function getTestXml() 
    { 
     $testElements = [ 
      'foo' => 'foo', 
      'bar' => 'bar', 
      'baz' => [ 
       'empty' => null, 
      ], 
     ]; 

     $xml = new \DOMDocument('1.0', 'UTF-8'); 
     $test = $this->buildXmlNodeFromArray($xml, 'test', $testElements); 

     $xml->appendChild($test); 

     return $xml->saveXml(); 
    } 

    /* Here's where all the magic happens */ 
    private function buildXmlNodeFromArray(\DOMDocument $document, $nodeName, array $nodeElements) 
    { 
     $node = $document->createElement($nodeName); 

     foreach ($nodeElements as $key => $value) { 
      if (null === $value || '' === $value) { 
       $emptyValue = $document->createTextNode(''); 
       $emptyElement = $document->createElement($key); 
       $emptyElement->appendChild($emptyValue); 

       $node->appendChild($emptyElement); 
      } elseif (is_array($value)) { 
       $subNode = $this->buildXmlNodeFromArray($document, $key, $value); 

       $node->appendChild($subNode); 
      } else { 
       $node->appendChild($document->createElement($key, $value)); 
      } 
     } 

     return $node; 
    } 
} 

$test = new Test(); 

echo $test->getTestXml(); 

結果:

<?xml version="1.0" encoding="UTF-8"?> 
<test> 
    <foo>foo</foo> 
    <bar>bar</bar> 
    <baz> 
     <empty></empty> 
    </baz> 
</test>