使用 PHP 解析 XML 元素和属性


Parsing XML element & attributes with PHP

我是PHP的新手,一直在尝试编写xml解析器,但是碰壁了,这让我发疯了!

我想做什么:

  • 编写一个解析器,循环访问元素和属性的XML文件,将结果存储到MySQL数据库中。

示例 XML 结构:

<playerdata>
<players>
    <player>
        <playername id="1">Human</playername>
        <allianceid id="18" />
        <allianceroleid id="22" />
        <race id="1" />
    </player>
    <player>
        <playername id="2">Machine</playername>
        <allianceid id="42" />
        <allianceroleid id="86" />
        <race id="3" />
    </player>
    <player>
        <playername id="3">Alien</playername>
        <allianceid id="1" />
        <allianceroleid id="2354" />
        <race id="1" />
    </player>
</players>
</playerdata>

示例 PHP 代码:

if (isset($_FILES['xml'])) {
if ($_FILES['xml']['size'] > 0) { 
    $file = $_FILES['xml']['tmp_name']; 
    mysqli_query($dbconnect,"TRUNCATE TABLE players") or die ("Error in query: $insert. ".mysqli_error($dbconnect));
    $xml = simplexml_load_file($file);
    $count = 0;
    foreach ($xml->player as $player) {
        $player_id = mysqli_real_escape_string($dbconnect,$player->playername['id']);
        $player_name = mysqli_real_escape_string($dbconnect,$player->playername);
        $alliance_id = mysqli_real_escape_string($dbconnect,$player->allianceid['id']);
        $alliance_role_id = mysqli_real_escape_string($dbconnect,$player->allianceroleid['id']);
        $player_race_id = mysqli_real_escape_string($dbconnect,$player->race['id']);
        // print $player_id . "<br />";
        mysqli_query($dbconnect,"INSERT INTO players (player_id, player_name, alliance_id, alliance_role_id, player_race_id) 
                                 VALUES ('$player_id', '$player_name', '$alliance_id', '$alliance_role_id', '$player_race_id')") or die ("Error in query: $insert. ".mysqli_error($dbconnect));
        $count++;
    }
    //redirect 
    header('Location: index.php?success=1?inserts=' . $count . ''); die; 
}}

结果:数据库已清除,所有项目均已正确导入!

实际上,不会向数据库中添加新行。此代码仅适用于访问元素;但在尝试访问元素和属性时不再有效。

其他信息: 当前使用 PHP 5.4

任何帮助将不胜感激!

我在您的代码中发现了两个问题,首先您的 xml 在倒数第二行缺少结束玩家标签。

其次你不能直接访问玩家标签,你需要先通过玩家标签。

您可以简单地替换:

 foreach ($xml->player as $player) {

 foreach ($xml->players->player as $player) {

可以使用以下代码来分析 xml。

$xml = simplexml_load_file($file);
xml_parse_into_struct($xml, $simple, $vals, $index);

这将为您提供$vals数组

echo "'nVals array'n";
print_r($vals);

做你想做的事