【问题标题】:Exporting to XML with PHP使用 PHP 导出到 XML
【发布时间】:2017-03-08 19:56:38
【问题描述】:

尝试以下 PHP 导出到 XML,以便为 Yealink SIP-T46G 创建远程电话簿。到目前为止已成功,但目前导出的 XML 格式无法在手机上使用。纵观整个网站,我发现了类似的问题,但未能成功。

<?php
include './data/datalogin.php';
$sql = mysqli_query($con,"SELECT contact_id, name, phone, cell FROM contact ORDER BY name ASC");
$xml = "<root_contact>";

while($r = mysqli_fetch_array($sql))
{
$xml .= "<contact>";
$xml .= $display_name=$r["name"];
$xml .= $office_number=$r["phone"];
$xml .= $mobile_number=$r["cell"];
$xml .= "</contact>";
}
$xml .= "</root_contact>";

$sxe = new SimpleXMLElement($xml);
$dom = new DOMDocument('1,0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($sxe->asXML());
echo $dom->saveXML();
$dom->save('phonebookt47.xml');
?>

当前的输出格式是在显示后立即添加电话号码,而不是下面的所需格式。

<contact>SampleCompany01666666666</contact>

需要以以下格式导出

<contact display_name="SampleCompanyName" office_number="01666666666" mobile_number="07945444444"/>

我不认为它很远,但感谢任何帮助。

【问题讨论】:

标签: php sql xml export export-to-xml


【解决方案1】:

您需要将属性放在content 标签中,如下所示:

<?php
include './data/datalogin.php';
$sql = mysqli_query($con,"SELECT contact_id, name, phone, cell FROM contact ORDER BY name ASC");

$xml = "<root_contact>";

while($r = mysqli_fetch_array($sql))
{
   $xml .= '<contact display_name="'.$r["name"].'" office_number="'.$r["phone"].'" mobile_number="'.$r["cell"].'" />';
}

$xml .= "</root_contact>";

$sxe = new SimpleXMLElement($xml);
$dom = new DOMDocument('1,0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($sxe->asXML());

echo $dom->saveXML();

$dom->save('phonebookt47.xml');
?>

【讨论】:

  • 感谢您如此迅速地回复。似乎是朝着正确方向迈出的一步,但运行时会出现以下错误消息。解析错误:语法错误,第 13 行 /var/www/html/genxml.php 中的意外 '1' (T_LNUMBER) 看起来数组中的某些内容已正确关闭?
  • 对不起,我的报价不匹配。我更新了代码。
  • 是的,现在看来它正在按预期工作。再次感谢您,Nosajimiki 和 Sergio。所有有用的建议。
【解决方案2】:

您可以将SimpleXMLElementaddChild()addAttribute() 一起使用:

<?php
$data = [
    ['id' => 1, 'name' => 'Contact One', 'phone' => '555555501', 'cell' => '999999901'],
    ['id' => 2, 'name' => 'Contact Two', 'phone' => '555555502', 'cell' => '999999902'],
    ['id' => 3, 'name' => 'Contact Three', 'phone' => '555555503', 'cell' => '999999903'],
];

$xml = new SimpleXMLElement('<root_contact/>');

foreach($data as $r) {
    $contact = $xml->addChild('contact');
    $contact->addAttribute('display_name', $r["name"]);
    $contact->addAttribute('office_number', $r["phone"]);
    $contact->addAttribute('mobile_number', $r["cell"]);
}

$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml->asXML());

header('Content-Type: text/xml');
echo $dom->saveXML();

//$dom->save('phonebookt47.xml');

【讨论】:

    【解决方案3】:

    由于您将 XML 编写为串联字符串,因此您只需要确保包含其中的所有静态文本。它应该看起来像这样:

      $xml .= '<contact display_name="' . $r["name"] . '"office_number="' . $r["cell"] . '" mobile_number="' . $r["cell"] . '"/>';
    }
    

    编辑:只需将您的字符串作为文本转储到文件中。这消除了设备支持 SimpleXMLElement 功能的需要。

    性能说明:我故意将其压缩为一行,因为每次使用 $xml .= 时,它都会重新加载整个 xml 字符串以附加下一个参数。如果使用大型 XML,这会大大减慢您的速度。

    如果这仍然太慢,您甚至可能想要创建一个兑现变量,在将它们写入您的 xml 字符串之前一次存储多个条目。

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 2013-04-04
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      相关资源
      最近更新 更多