我正在解析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')");
}
}
}
}
答案 0 :(得分:0)
你解释过像
节点“MinValues”对某些行的插入不正确,但没有 所有。如果结构中不存在此节点,则为该值 应该是0.我已经在代码中放置了检查,以确保它是否丢失 然后设置为0,但问题仍然存在。
你还告诉你已经检查了它,但是什么时候你不会从源头收到MinValues
元素?
所以我想建议当你正在阅读你的XML时,当你找到MaxValues
并在它之后找到没有MinValues
的下一个元素时,肯定会把它放在你的写作过程中用0 '价值。
答案 1 :(得分:0)
回答者:
事实证明NameRecommendation是可重复的,所以我也需要在这个节点上重置MinValues。当你知道答案时,事情是多么容易。