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

How to parse following type of XML and store it into database using PHP

我必须解析这种类型的 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>

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

我已经尝试了以下 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));
}

您遇到的问题与数据库有关,但首先与遍历 XML 文档有关。

根据您的概述,您基本上想要跳过前两个条目,并且您想要每两个条目 - nameversion.

这可以通过使用 Iterator 来非常直接地管理 - PHP 附带的具体迭代器和允许您继续前进的接口本身while foreach 已经遍历了 XML 文档。

所以首先跳过前两个条目:

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

foreach ($limit as $row) {

这里你的 $xml 首先被包装成一个 IteratorItertorSimpleXMLElement[=54= 所必需的) ] 因为它是一个 TraversableLimitIterator 需要一个真正的 Iterator) 和 2 作为第二个参数只是告诉偏移量。等于:跳过前两个条目。

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

foreach ($limit as $row) {

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

    ...

$limit->next() 调用只是前进到下一个元素,$limit->current() 获取下一个元素。

就这样了。完成后,每个条目(对)的 foreach 内都有 $name$version。然后您只需执行插入操作。这是 PDO 的示例:

$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));
}

此脚本可以快速且完美地插入配置的数据库:

CREATE TABLE test.software (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(255),
  `version` VARCHAR(127)
);