PHP 从数据库中提取,转换为 XML 并附加到现有的 XML 文档

PHP Pull from database, convert to XML and append to existing XML document

我正在尝试从另一个 SimpleXMLElement 添加到一个 SimpleXMLElement,但出现错误:

Warning: SimpleXMLElement::addChild(): Cannot add child. Parent is not a permanent member of the XML tree

$xml = $Global->serializeTradeShowTable();
$xmlDeser = simplexml_load_string($xml);

$doc = simplexml_load_file($path);
$tradeshows = $doc->Tradeshows;

foreach($xmlDeser->item as $item)
{

    $name = (string)$item->friendlyName;
    $formatted_name = str_replace(' ', '_', $name);

    $sxe = new \SimpleXMLElement("<option></option>");
    $sxe->addAttribute('name', $formatted_name);
    $sxe->addAttribute('value', $name);
    $sxe[0] = $name;

    $tradeshows->addChild($sxe);

}

我不确定为什么我不能将一种类型的 SimpleXMLElement 传递给另一种类型。是否需要某种类型的命名空间?任何帮助将不胜感激。

你有几个问题。我认为导致主要错误的第一个是线路问题...

$tradeshows = $doc->Tradeshows;

您需要检查这是否为您提供了您期望的节点。如果您的文档是(例如)

<Tradeshows>
</Tradeshows>

那么 $tradeshows 应该只是

$tradeshows = $doc;

但没有实际的 XML,很难判断。但这是您应该能够更正“Parent is not a permanent member”位的地方。

其次,addChild 采用元素的名称和可选的值。您正在尝试添加一个 SimpleXMLElement。如果您将代码更改为...

foreach($xmlDeser->item as $item)
{
    $name = (string)$item->friendlyName;
    $formatted_name = str_replace(' ', '_', $name);

    $newElement = $tradeshows->addChild("option");
    $newElement->addAttribute('name', $formatted_name);
    $newElement->addAttribute('value', $name);
}

这个应该在里面加上<option>然后设置属性