我必须解析这种类型的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));
}
答案 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));
}