我正在解析一个500MB的XML文件,用于ebay的全部“GetCategorySpecifics”并存储在本地数据库中。PHP XMLReader给出的值不正确
节点“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')");
}
}
}
}
有时使用':: next()'与':: readString()'结合使用不仅仅是':: read()'和' - > value'更容易http://eval.in/private/8337d6efc086a3 - 也有https://github.com/hakre/XMLReaderIterator – hakre 2013-05-12 22:18:03