PHP 导入/解析 XML 文件内容保存到数据库

PHP Import / Parse XML File Content Save To Database

正在尝试将短信日志导入 php 以便在 mysql 数据库中进行解析。 在抓取所有记录的完整数组之后无法解析单个数组值。

文件加载,能够成功打印整个输入数组,但是 foreach 循环 returns 只有一个结果,不是全部 13 个,并且是空的。

// Load xml file else check connection
$xml = simplexml_load_file("input.xml") or die("Error: Cannot load file");
$con = json_encode($xml);
$newXML = json_decode($con, true);

print_r($newXML['sms']); //Output: Prints 0-4 lines successfully all together in array

foreach ($newXML['sms'] as $attrib) {
    
    $date = $attrib->date;
    $body = $attrib->body;
    echo $date . " - " . $body; // test output (fails and returns empty)

//Save Each Separate array line (sms message record) info to Db...
...

XML 文件布局:

<?xml version="1.0" encoding="UTF-8"?>
<smsgroup>
    <sms address="1234567" time="Apr 30, 2022 1:00:00 PM" date="1555987654339" type="2" body="message 5" read="1" />
    <sms address="1234567" time="Apr 30, 2022 1:00:00 PM" date="1555987654333" type="1" body="sms 4" read="1" />
    <sms address="5555555" time="Apr 30, 2022 1:00:00 PM" date="1555987654329" type="1" body="another message 3" read="1" />
    <sms address="5555555" time="Apr 30, 2022 1:00:00 PM" date="1555987654324" type="1" body="message 2" read="1" />
    <sms address="1234567" time="Apr 30, 2022 1:00:00 PM" date="1555987654321" type="2" body="message 1" read="1" />
</smsgroup>

试试这个:

foreach ($newXML['sms'] as $attrib) {
    $date = $attrib["@attributes"]["date"];
    $body = $attrib["@attributes"]["body"];
    echo $date . " - " . $body; 
}

考虑使用 LOAD XML 将相对平坦的 attribute-centric XML 直接导入 MySQL table。下面可以是 运行 作为来自 PHP.

的任何其他 SQL 命令

假设所有属性名称匹配 table 个名称(尽管忽略不匹配的名称):

LOAD XML LOCAL INFILE 'input.xml' 
  INTO TABLE myTable 
  ROWS IDENTIFIED BY '<sms>';

或者,将局部变量与 SET 一起用于特定列或不同命名的 table 名称:

LOAD XML LOCAL INFILE 'input.xml'
  INTO TABLE myTable (@date, @body) 
  ROWS IDENTIFIED BY '<sms>'
  SET date_column=@date, body_column=@body; 

您可以通过正确使用 SimpleXML 来简化您的代码,而不必 json 对数据进行编码和解码...

使用 -> 访问元素,使用 [] 访问属性。

$xml = simplexml_load_file('input.xml') or die('Error: Cannot load file');

foreach ($xml->sms as $attrib) {
    $date = $attrib['date'];
    $body = $attrib['body'];
    echo $date . ' - ' . $body; // test output (fails and returns empty)
}