如何解析以下类型的XML并使用PHP将其存储到数据库中

时间:2015-03-07 14:51:51

标签: php xml simplexml

我必须解析这种类型的XML并存储到数据库中。请帮忙。

这是XML ..

<?xml version='1.0' encoding='ASCII'?>
<root>
    <mac>mac_n</mac>
    <ip_addr>ip_addr_n</ip_addr>
    <name1>Adobe AIR</name1>
    <version1>15.0.0.356</version1>
    <name2>Adobe Flash Player 16 PPAPI</name2>
    <version2>16.0.0.235</version2>
</root>

我想以这样的方式解析这个XML:mac-address&amp; ip被解析一次,它可以存储到数据库中,用于每个软件名称和版本。

我尝试过以下PHP代码..对于标签只有类似<name>但不像<name1><name2>的情况。我想调整上面提到的这种XML格式的代码。

$url = "audit.xml";

$xml = simplexml_load_file($url);

$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $db->prepare("INSERT INTO software(name, version) VALUES(?, ?)");

foreach ($xml as $software => $row) {
    $name    = $row->name;
    $version = $row->version;

    $stmt->execute(array($name, $version));
}

1 个答案:

答案 0 :(得分:1)

您遇到的问题不是数据库,而是首先遍历XML文档。

根据您的概述,您基本上想要跳过前两个条目,并且您希望每两个条目 - 名称版本

通过使用 Iterator 可以非常直接地管理这个问题 - 这些都是PHP附带的具体内容以及允许您在 { { {1}}已遍历XML文档。

首先,跳过前两个条目:

foreach

此处$limit = new LimitIterator(new IteratorIterator($xml), 2); foreach ($limit as $row) { 首先包含在 IteratorItertor 中( SimpleXMLElement 是必需的,因为它是可遍历但< strong> LimitIterator 需要一个真正的迭代器)而$xml作为第二个参数只需要告诉偏移量。等于:跳过前两个条目。

接下来是一次获取两个条目。 2只获取一个条目一次,因此第二个条目需要手动“获取”:

foreach

foreach ($limit as $row) { $name = (string) $row; $limit->next(); $version = (string) $limit->current(); ... 调用只是前进到下一个元素,$limit->next()调用下一个元素。

就是这样。完成后,您在每个条目(对)的foreach中都有$limit->current()$name。然后,您只需执行插入操作。以下是PDO的一个示例:

$version

此脚本可以快速,完美地插入到已配置的数据库中:

$buffer = <<<XML
<?xml version='1.0' encoding='ASCII'?>
<root>
    <mac>mac_n</mac>
    <ip_addr>ip_addr_n</ip_addr>
    <name1>Adobe AIR</name1>
    <version1>15.0.0.356</version1>
    <name2>Adobe Flash Player 16 PPAPI</name2>
    <version2>16.0.0.235</version2>
</root>
XML;

$xml = simplexml_load_string($buffer);

$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'testuser', 'test');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $db->prepare("INSERT INTO software (`name`, `version`) VALUES(?, ?)");

$limit = new LimitIterator(new IteratorIterator($xml), 2);

foreach ($limit as $row) {

    $name = (string)$row;
    $limit->next();
    $version = (string)$limit->current();

    $stmt->execute(array($name, $version));
}

enter image description here