PHP:while循环中的SimpleXMLElement只迭代一次

时间:2012-09-23 21:54:21

标签: php simplexml

我正在尝试检索多个.xml文件(001.xml,002.xml,002.xml等),从数据库表中添加新的子信息,然后将修改后的信息保存为本地新文件。 / p>

即使数据库中有很多行,使用SimpleXMLElement函数也可以防止脚本执行多次。

以下是代码的简化版本:

$query=mysql_query('SELECT id FROM `table`');

while($row = mysql_fetch_array($query))
{    
    $contents = file_get_contents('path_to_url'.$row[0]);
    $xml = new SimpleXMLElement($contents);

    // Append information to xml data
    for($i=0; $i < count($xml->parent->children->child); $i++)
    {             
        $query=mysql_query('
            SELECT `age`
            FROM `table2`
            WHERE `name` = '.$xml->parent->children->child[$i]->name
        );
        $childage = mysql_fetch_array($query);

        $xml->parent->children->child[$i]->addChild('age',$childage[0]);
    }

    $file = 'id'.$row[0].'.xml'; 

    file_put_contents($file, $xml->asXML());      
}

这是原始样本.xml数据:

001.xml    
<parent>
    <children>
        <child>
            <name>herp</name>
        </child>
        <child>
            <name>derp</name>
        </child>          
    </children>
<parent>

002.xml    
<parent>
    <children>
        <child>
            <name>manny</name>
        </child>
        <child>
            <name>joe</name>
        </child>
        <child>
            <name>jack</name>
        </child>            
    </children
</parent>

这将是输出(请注意,因为循环停止而未写入002.xml)

001.xml    
<parent>
    <children>
        <child>
            <name>herp</name>
            <age>10</age>
        </child>
        <child>
            <name>derp</name>
            <age>12</age>
        </child>          
    </children>
</parent>

3 个答案:

答案 0 :(得分:0)

将while($ row = mysql_fetch_array($ query,MYSQL_NUM))更改为 while($ row = mysql_fetch_array($ query))

答案 1 :(得分:0)

for($i=0; $i < count($xml->parent1->child1); $i++)需要更改为     for($i=1; $i <= mysql_num_rows($query); $i++)

$query=mysql_query('SELECT id FROM `table`', MYSQL_NUM);

while($row = mysql_fetch_array($query))
{    
$xml = new SimpleXMLElement('path_to_url'.$row[0].'.xml')) 

// Append information to xml data
for($i=1; $i <= mysql_num_rows($query); $i++)
{             
    $query=mysql_query('
        SELECT `id`
        FROM `table2`
        WHERE `column` = '.$xml->parent->child1[$i]
    );
    $row = mysql_fetch_assoc($query, MYSQL_NUM);

    $xml->parent->child1[$i]->addChild('child2',$row[0]);
}

$file = 'id'.$row[0].'.xml'; 

file_put_contents($file, $xml);      
}

答案 2 :(得分:0)

首先尝试将代码放在函数中,然后在循环内(在该范围之外)调用函数。这是我在循环中不止一次调用SimpleXMLElement的唯一方法。

示例:

while($row = mysql_fetch_array($query))
{  
    myFunction($row);
}  

function myFunction($row){
    $xml = new SimpleXMLElement('path_to_url'.$row[0].'.xml')) 

    // Append information to xml data
    ...
}