2013-05-05 3 views
0

Я не могу импортировать мой большой xml-файл (1,5 г) в базу данных. Затем я использую XMLReader->read(). У меня есть ошибка, где элемент имеет амперсанд. возможно, вы можете мне помочь, когда я конвертирую неверный файл XML в действительный?Импортировать недопустимый XML-файл (1.5G) в MySQL с unescaped ampersand

Я использую аккуратный, xmlsoft, sed в Windows 7, но это программное обеспечение командной строки ломается при ошибке предельной памяти.

PHP:

$reader = new XMLReader(); 
$reader->open('sm.xml'); 

    while ($reader->read()) 
     { 
     // check to ensure nodeType is an Element not attribute or #Text 
      if ($reader->nodeType == XMLReader::ELEMENT) 
        { 
         if ($reader->localName == 'brand') 
           { 
            $reader->read(); 
            $data['brand'] = $reader->value; 
           } 
         if ($reader->localName == 'number') 
           { 
            $reader->read(); 
            $data['number'] = $reader->value; 
           } 
         if ($reader->localName == 'descr') 
           { 
            $reader->read(); 
            $data['descr'] = $reader->value; 
           } 

         if ($reader->localName == 'price') 
           { 
            $reader->read(); 
            $data['price'] = $reader->value; 
           } 
         if ($reader->localName == 'deadline') 
           { 
            $reader->read(); 
            $data['deadline'] = $reader->value; 
           } 
         if ($reader->localName == 'rest') 
           { 
            $reader->read(); 
            $data['rest'] = $reader->value; 
           } 
      } //Checking if the </person>tag is reached. 
      elseif($reader->nodeType == XMLReader::END_ELEMENT AND $reader->name == 'article') 
       { 

        $sql = 'INSERT INTO tec (brand_name,brand_art,name_tov,cena,srok,kolvo) 
    VALUES ("'.$data['brand'].'","'.$data['number'].'","'.$data['descr'].'","'.$data['price'].'","'.$data['deadline'].'","'.$data['rest'].'");'; 
    $mysqli->query($sql); 

       // Insert the content of array $data to database or some other action. 
       //print_r($data); 

       } 
} 

Если этот код чтения элемент <number>111&111</number> У меня есть ошибка. Я могу удалить этот амперсанд с помощью инструмента командной строки, но у меня нехватка памяти на очень большом XML-файле.

Мой пример запуска:

xmllint.exe --recover --maxmem 10000000000 --noout --encode utf8 sm.xml -o smtt.xml 
tidy.exe -m -utf8 -xml sm.xml 
sed.exe 's/&/\&amp;/g; s/&amp;amp;/\&amp;/g; s/&amp;quot;/\&quot;/g;' sm.xml > smtt.xml <-- can't run 

Может есть другой способ использовать PHP XMLReader с проверкой пропуском?

+0

Можем ли мы увидеть ваш PHP-код? Проблема в том, что у вас амперсанд, или у вас заканчивается память? Какая именно ошибка вы получаете? – halfer

+0

проблема, когда у меня есть амперсанд, я не могу убежать или пропустить этот символ? из памяти я имею в виду revalidate большой файл xml для подготовки читать для php xmlreader. Ошибка php: XMLReader-> read() 111 & 111 Mike

+0

Правильно, поэтому у вас есть две ошибки: одна из них заключается в том, что если вы попытаетесь исправить недопустимый XML, у вас закончится нехватка памяти, а вторая - если вы не исправить неверный XML, вы получите ошибку чтения. Предполагается вторая, поэтому вы должны попытаться исправить свой XML. 1. ** Точно ** в какой утилите командной строки не хватило памяти? 2. Можете ли вы заменить это другой утилитой? – halfer

ответ

0

Редактор XMLMax (из xponentsoftware) обнаружит ошибку и позволит исправить ее в своем виртуальном текстовом редакторе. 1,5 ГБ не должно быть проблемой.

Отказ от ответственности: Я являюсь аффилированным лицом с продавцом.