2013-03-19 3 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/ how-do-i-create-a-empty-blank-simplexmlelement-in-php) – Steven

+0

так что, я получил ответ ... –

ответ

2

Вы должны явно добавить пустой текстовый узел:

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

Второй аргумент createElement() является нестандартным и лично я не использую его, потому что он может производить несколько неинтуитивного поведение, как это.

Вы должны всегда создавать текстовые узлы явно на мой взгляд. Другая причина для этого заключается в том, что текстовые узлы автоматически обрабатывают экранирование правильно, в отличие от нестандартного второго аргумента, который требует, чтобы вы вручную удалили текстовые данные.

+0

wow that was gr есть, спасибо ... –

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> 
Смежные вопросы