如何使用对象作为PHP的createElement的参数

问题描述 投票:2回答:4

我正在使用变量来创建元素。但我收到此错误:

警告:DOMDocument :: createElement()期望参数1为字符串,给定对象

// load up your XML
$xml = new DOMDocument;

$xml->load('test.xml');    

$parent_node = $xml->createElement('parent');

foreach ($xml->getElementsByTagName('product') as $product ) 
{
 $append = array();

foreach($product->getElementsByTagName('name') as $name ) {
// Stick $name onto the array
$append[] = $name;
}

foreach ($append as $a)  {

$parent_node->appendChild($xml->createElement($a, 'anothervalue'));

 $product->appendChild($parent_node);

}


$product->removeChild($xml->getElementsByTagName('details')->item(0));
//$product->appendChild($element);
}

// final result:

$result = $xml->saveXML();

原始XML结构:

<products>
 <product>
 <name>text</name>
 <name>text</name>
 <name>text</name>
 </product>
 </products>

我正在尝试创建一个新元素,其值是其自身的文本。我知道它的外观。为什么不能使用对象创建元素?

我试图获得的结果将如下所示:

 <products>
 <product>
 <text>text</text>
 <text>text</text>
 <text>text</text>
 </product>
 </products>
php xml dom
4个回答
2
投票

您不能传递对象,必须使用textContentnodeValue属性:

$element = $xml->createElement(trim($a->textContent), 'anothervalue');

您可能还想先将其从非法字符中删除:

$nodeName = preg_replace('/[^a-z0-9_-]/i', '', $a->textContent);
$element = $xml->createElement($nodeName, 'anothervalue');

1
投票

在foreach循环之前声明数组,否则每次循环完成时它将变为空

    $append = array();
    foreach ($xml->getElementsByTagName('product') as $product ) 
    {
         foreach($product->getElementsByTagName('name') as $name ) {
             // Stick $name onto the array
             $append[] = $name;
          }

         foreach ($append as $a)  {
              $parent_node->appendChild($xml->createElement($a, 'anothervalue'));
              $product->appendChild($parent_node);
          }

         $product->removeChild($xml->getElementsByTagName('details')->item(0));
         //$product->appendChild($element);
    }

0
投票
$parent_node->appendChild($xml->createElement($a->nodeValue, 'anothervalue'));

获得元素值,如果您想获得元素名称..请使用'$a->nodeName'


0
投票

只需更改这一行

$ append [] = $ name;

至$ append [] = $ name-> tagName;

然后应该起作用

© www.soinside.com 2019 - 2024. All rights reserved.