PHP XMLReader提供的值不正确

时间:2013-05-10 11:45:21

标签: php xml xmlreader

我正在解析eBay全系列“GetCategorySpecifics”的500MB XML文件并存储在本地数据库中。

节点“ MinValues ”对某些行插入不正确,但并非全部插入。如果结构中不存在此节点,则该值应为0.我已在代码中放置检查以确保它是否丢失然后设置为0,但问题仍然存在。

XML结构:

<Recommendations>
    <CategoryID>80</CategoryID>
        <NameRecommendation>
             <Name>Size</Name>
             <ValidationRules>
                     <MaxValues>1</MaxValues>
                     <MinValues>1</MinValues>
                     <SelectionMode>FreeText</SelectionMode>
             </ValidationRules>
             <ValueRecommendation>
                 <Value>Large</Value>
             </ValueRecommendation>
        </NameRecommendation>
</Recommendations>

PHP:

// Define XMLreader
    $xml = new XMLReader;
    $xml->open($xml_file,"UTF-8",LIBXML_ERR_ERROR);
    $xml->read();

// Loop through file
    while ($xml->read()) {

        // check this isn't an ending node
        if ($xml->nodeType != XMLReader::END_ELEMENT) {

                // Its a new category - reset variables and define new ID 
                if ($xml->name == 'CategoryID') {

                    $MinValues = 0; $MaxValues = 1; $SelectionMode = '';
                    $xml->read();

                    // Validate new category ID - if invalid move to next 
                    if ($xml->name == '#text' && $xml->hasValue) {
                       $CategoryID = trim($xml->value);  
                       if (!is_numeric($CategoryID) || empty($CategoryID) || $CategoryID < 1) {
                          $xml->next('Recommendations');
                       }             
                    }         
                    else {
                        $xml->next('Recommendations');
                    }   

                }


                // It's the Name tag - define Name variable 
                if ($xml->name == 'Name') {

                    $xml->read();
                    if ($xml->name == '#text' && $xml->hasValue) {
                        $Name = mysql_real_escape_string($xml->value);       
                    }        

                }

                // It's the MaxValues tag - define MaxValues variable 
                if ($xml->name == 'MaxValues') {

                    $xml->read();
                    if ($xml->name == '#text' && $xml->hasValue) {
                        $MaxValues = mysql_real_escape_string($xml->value); 
                        if (!is_numeric($MaxValues) || empty($MaxnValues) || $MaxValues < 1) {    
                            $MaxValues = 1; 
                         }
                     }     

                 }

        // It's the MinValues tag - define MinValues variable 
        if ($xml->name == 'MinValues') {
            $xml->read();
            if ($xml->name == '#text' && $xml->hasValue) {
                $MinValues = mysql_real_escape_string($xml->value); 
                if (!is_numeric($MinValues) || empty($MinValues) || $MinValues < 1) {    
                    $MinValues = 0; 
                }
            }                        
        }


        // It's the SelectionMode tag - Insert new entry row into DB
        if ($xml->name == 'SelectionMode') {
            $xml->read();
            if (($xml->name == '#text') && $xml->hasValue) {
                $SelectionMode = mysql_real_escape_string($xml->value);  
                mysql_query("INSERT INTO entry (entry_id,CategoryID,Name,MaxValues,MinValues,SelectionMode) VALUES ('','$CategoryID','$Name','$MaxValues','$MinValues','$SelectionMode')");                 
                $entry_id = mysql_insert_id();                   
            }                
        }     

        // It's the Value tag - Insert new values row into DB
        if ($xml->name == 'Value') {
            $xml->read();
            if (($xml->name == '#text') && $xml->hasValue) {          
                $Value = mysql_real_escape_string($xml->value);
                mysql_query("INSERT INTO values (value_id,entry_id,CategoryID,Value) VALUES ('','$entry_id','$CategoryID','$Value')");
            }
        }   
        }
    }

2 个答案:

答案 0 :(得分:0)

你解释过像

  

节点“MinValues”对某些行的插入不正确,但没有   所有。如果结构中不存在此节点,则为该值   应该是0.我已经在代码中放置了检查,以确保它是否丢失   然后设置为0,但问题仍然存在。

你还告诉你已经检查了它,但是什么时候你不会从源头收到MinValues元素?

所以我想建议当你正在阅读你的XML时,当你找到MaxValues并在它之后找到没有MinValues的下一个元素时,肯定会把它放在你的写作过程中用0 '价值。

答案 1 :(得分:0)

回答者:

事实证明NameRecommendation是可重复的,所以我也需要在这个节点上重置MinValues。当你知道答案时,事情是多么容易。