如何解析以下类型的 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 文档有关。
根据您的概述,您基本上想要跳过前两个条目,并且您想要每两个条目 - name 和 version.
这可以通过使用 Iterator 来非常直接地管理 - PHP 附带的具体迭代器和允许您继续前进的接口本身while foreach
已经遍历了 XML 文档。
所以首先跳过前两个条目:
$limit = new LimitIterator(new IteratorIterator($xml), 2);
foreach ($limit as $row) {
这里你的 $xml
首先被包装成一个 IteratorItertor(SimpleXMLElement[=54= 所必需的) ] 因为它是一个 Traversable 但 LimitIterator 需要一个真正的 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)
);
我必须解析这种类型的 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 文档有关。
根据您的概述,您基本上想要跳过前两个条目,并且您想要每两个条目 - name 和 version.
这可以通过使用 Iterator 来非常直接地管理 - PHP 附带的具体迭代器和允许您继续前进的接口本身while foreach
已经遍历了 XML 文档。
所以首先跳过前两个条目:
$limit = new LimitIterator(new IteratorIterator($xml), 2);
foreach ($limit as $row) {
这里你的 $xml
首先被包装成一个 IteratorItertor(SimpleXMLElement[=54= 所必需的) ] 因为它是一个 Traversable 但 LimitIterator 需要一个真正的 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)
);