-1

hy,我希望你能帮助我!我必须将一个大文件拆分成更小的文件才能将数据放入数据库中。我阅读了很多帖子,发现一个非常好的帖子,这是网址:

如何使用 PHP 将大的 XML 文件拆分成更小的文件?

但我有一些问题: 1. 我必须读取一个带有 400.000 记录的 xml,脚本在 170.000 处停止,我真的不知道怎么做,我需要做一些改变吗?2. 可以输入数据吗?3. 我必须阅读一个巨大的文件和任何浏览器崩溃。你知道一些软件,我可以用简单的方式从 url for mac 读取数据吗?

真的谢谢!

有关 XML 文件的更多信息:

我复制并过去了xml格式;不是三个点,而是信息。

<?XML version=“1.0” encoding=“UTF-8” ?> 

<vortigo> 

<annuncio> 

<id_annuncio> <![CDATA[ . . . ]]> </id_annuncio> 
<link> <![CDATA[ . . . ]]> </link> 
<titolo> <![CDATA[ . . . ]]> </titolo> 
<tipo_contratto> <![CDATA[ . . . ]]> </tipo_contratto> 
<tipologia> <![CDATA[ . . . ]]> </tipologia> 
<descrizione> <![CDATA[ . . . ]]> </descrizione> 

<classe_energetica> <![CDATA[ . . . ]]> </classe_energetica>
<indice_energetica> <![CDATA[ . . . ]]> </indice_energetica>
<numero_stanze> <![CDATA[ . . . ]]> </numero_stanze>
<numero_bagni> <![CDATA[ . . . ]]> </numero_bagni>
<superficie> <![CDATA[ . . . ]]> </superficie>
<stato_immobile> <![CDATA[ . . . ]]> </stato_immobile>
<prezzo> <![CDATA[ . . . ]]> </prezzo> 
<prezzo_giorno> <![CDATA[ . . . ]]> </prezzo_giorno>
<prezzo_settimana> <![CDATA[ . . . ]]> </prezzo_settimana>
<prezzo_scontato> <![CDATA[ . . . ]]> </prezzo_scontato>

<comune> <![CDATA[ . . . ]]> </comune> 
<nazione> <![CDATA[ . . . ]]> </nazione> 
<regione> <![CDATA[ . . . ]]> </regione> 
<provincia> <![CDATA[ . . . ]]> </provincia> 
<indirizzo> <![CDATA[ . . . ]]> </indirizzo> 
<cap> <![CDATA[ . . . ]]> </cap>
<zona> <![CDATA[ . . . ]]> </zona>
<longitudine> <![CDATA [ . . . ]]> </longitudine>
<latitudine> <![CDATA[ . . . ]]> </latitudine>
<data_aggiornamento> <![CDATA[ . . . ]]> </data_aggiornamento> 
<immagini>

<immagine>
<immagine_url> <![CDATA[ . . . ]]> </immagine_url>
<immagine_titolo> <![CDATA[ . . . ]]> </immagine_titolo>
</immagine>

<immagine>
<immagine_url> <![CDATA[ . . . ]]> </immagine_url>
<immagine_titolo> <![CDATA[ . . . ]]> </immagine_titolo>
</immagine>

...
</immagini> 

<tipo_venditore> <![CDATA[ . . . ]]> </tipo_venditore>
<agenzia_nome> <![CDATA[ . . . ]]> </agenzia_nome> 
<agenzia_comune> <![CDATA[ . . . ]]> </agenzia_comune> 
<agenzia_email> <![CDATA[ . . . ]]> </agenzia_email> 
<agenzia_url> <![CDATA[ . . . ]]> </agenzia_url> 

<piscina> <![CDATA[ . . . ]]> </piscina> 
<giardino> <![CDATA[ . . . ]]> </giardino> 
<condizionatore> <![CDATA[ . . . ]]> </condizionatore> 
<riscaldamento> <![CDATA[ . . . ]]> </riscaldamento> 
<balcone> <![CDATA[ . . . ]]> </balcone> 
<terrazzo> <![CDATA[ . . . ]]> </terrazzo> 
<ascensore> <![CDATA[ . . . ]]> </ascensore> 
<cucina> <![CDATA[ . . . ]]> </cucina> 
<arredato> <![CDATA[ . . . ]]> </arredato> 
<parcheggio> <![CDATA[ . . . ]]> </parcheggio> 

<portale> <![CDATA[ . . . ]]> </portale> 
<tipo_portale> <![CDATA[ . . . ]]> </tipo_portale> 
<logo_portale> <![CDATA[ . . . ]]> </logo_portale> 

</vortigo>

信息被输入到数据库中,每个数据的所有列。提前谢谢!!!!

4

2 回答 2

2

您使用什么代码来解析 XML?由于您提到的问题已得到回答,因此您不应使用 easy SimpleXML,因为它非常慢且占用大量内存。这是 XMLReader-Class 的一个简单示例,它对较大的文件非常有效,因为它将它们流式传输,而不是作为一个整体读取文件:

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

while ($xml->read()) {
    // elements only. skipp element end-tags and cdata etc
    if ($xml->nodeType == XMLReader::ELEMENT) {

          // process the Elements e.g. in a switch statement:
          switch ($xml->name) {
                //...
          }
    }
}

您可以在 -Statement 中应用更改,switch因为您可以通过该$xml->readOuterXML()功能访问内容。如果您想要更轻松地访问内容,您可能需要再次解析特定部分SimpleXMLElement

 $elem = new SimpleXMLElement($xml->readOuterXML());

完成后不要忘记为unset即将$elem到来的条目释放内存。我使用完全相同的方法,可以在 2 秒内解析 10k 个条目,并且内存使用量不错。

对于您的最后一个问题:您可能希望将内容拆分为子部分。或者您使文件可下载,以便用户可以在他的计算机上将其作为一个整体打开。不幸的是,HTTP 不是最快的协议,也不是为大文件设计的。

编辑:我在 github 上更新了我的要点以匹配您的示例数据。它可能需要更多配置,例如因为您<immagini>需要一些嵌套循环。但它会给你一个关于如何解决这个问题的好主意。

于 2013-06-05T11:16:15.427 回答
0

您的脚本很可能由于以下原因之一而崩溃:1) PHP 脚本的内存/时间限制。它可以在您的 php.ini 文件中设置 2) XML 中的值不正确,您使用的解析器脚本无法解析什么。

于 2013-06-05T11:04:36.483 回答