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)
}
正在尝试将短信日志导入 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.
假设所有属性名称匹配 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)
}