I'm parsing a 500MB XML file for ebay's full range of "GetCategorySpecifics" and storing in the local database.
The node "MinValues" is inserting incorrectly for some rows, but not all. If this node doesn't exist in the structure, then the value should be 0. I've placed checks in the code to ensure if its missing then set to 0, but the problem remains.
XML structure:
<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')");
}
}
}
}