【问题标题】:How to use an object as a parameter for PHP's createElement如何使用对象作为 PHP 的 createElement 的参数
【发布时间】:2012-01-21 07:35:46
【问题描述】:

我正在使用一个变量来创建一个元素。但是我收到了这个错误:

警告: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>

【问题讨论】:

  • 因为createElement 需要一个字符串而不是一个对象。你有什么特别的问题吗?
  • 是否可以使用现有元素的内部文本来创建新元素?
  • 就像stackoverflow.com/questions/2087103/… 中解释的那样?或者只是“文本”(没有可能的子元素),例如当&lt;name&gt;text&lt;foo&gt;bar&lt;/foo&gt;&lt;/name&gt; 出现时,结果应该是什么?还是永远只是“文本”?
  • 没有可能的子元素。所以我会为每个 元素 创建一个新元素

标签: php xml dom


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      $parent_node->appendChild($xml->createElement($a->nodeValue, 'anothervalue'));
      

      这个获取元素值,如果你想获取元素名称..使用'$a-&gt;nodeName'

      【讨论】:

        【解决方案4】:

        只改这一行

        $append[] = $name;

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

        它应该可以工作

        【讨论】:

        • 不,它不会。 OP 正在寻找“文本”而不​​是“名称”,例如节点值
        猜你喜欢
        • 1970-01-01
        • 2014-03-15
        • 2015-11-02
        • 2023-01-07
        • 1970-01-01
        • 2017-07-15
        • 2021-06-04
        • 2020-05-03
        • 2016-11-13
        相关资源
        最近更新 更多