[英]Parsing a large (about 10 GB) nested XML file using PHP
我是php的新手,并且我有接近10GB的xml文件可导入mysql数据库。 xml文件是高度嵌套的。 我打算提取的是一些信息,而不是导入整个xml文件。 当我运行我的PHP代码时,结果为空白。 我的PHP代码是这样的:
<?php
error_reporting(-1);
ini_set('display_errors', true);
function get_reader($file){
$reader = new XMLReader;
$reader->open($file);
return $reader;
}
function handle_Entity(SimpleXMLElement $Entity){
/*
This gets called everytime an album node
has been iterated.
*/
printf(
"(%d) %s - %s\
",
$album->N2,
$album->N5,
$album->N9
);
}
$xml = get_reader('companies_xml_extract_20170703_1.xml');
while($xml->read()){
$isNewAlbum = 'NameElement' === $xml->name && $xml->nodeType ===
XMLReader::ELEMENT;
if($isNewAlbum){
$doc = new DOMDocument('1.0', 'UTF-8');
handle_Entity(
simplexml_import_dom($doc->importNode($xml->expand(), true))
);
}
}
从虚拟文件中,此信息的路径为:OrganisationName = N8:EntityList / N8:Entity / N2:OrganisationName / N2:NameElement CompanyID = N8:EntityList / N8:Entity / N5:Identifiers / N5:Identifier / N5:IdentifierElement UltimateHoldingCompanyName = N8:EntityList / N8:Entity / N9:UltimateHoldingCompany / N2:OrganisationName / N2:NameElement
查找附加的虚拟xml文件: 我的xml文件
最后,我期望打印“ UltimateHoldingCompanyName”,“ OrganisationName”,“ NameElement”
谢谢
如果文件那么大,那么SimpleXML就没什么用了,因为它需要将整个文件加载到内存中。 相反,您应该使用XMLReader之类的拉式解析器
由于您没有给我们足够的XML来获取您以后的所有数据,因此我仅设法构造了一些可以获取其中一部分数据的东西。
一件事是,当使用$reader->name
,它将包括名称空间,因此如在此代码中一样,您必须将全名放在文档中。
<?php
error_reporting ( E_ALL );
ini_set ( 'display_errors', 1 );
$reader = new XMLReader();
$reader->open("companies_xml_extract_20170703_1.xml");
$fo = fopen("companies.csv", "w" );
fputs($fo, "name, id, ultimateHoldingCompany".PHP_EOL);
while ( $reader->read()) {
if ( $reader->name == 'N8:Entity' &&
$reader->nodeType === XMLReader::ELEMENT ) {
$name = null;
$ultimateHoldingCompany = null;
$id = null;
$newNode = $reader->expand();
$nameNode = $newNode->getElementsByTagName('OrganisationName');
if ( $nameNode->length > 0 ){
$name = $nameNode[0]->getElementsByTagName('NameElement')->item(0)->nodeValue;
}
$nameNode = $newNode->getElementsByTagName('UltimateHoldingCompany');
if ( $nameNode->length > 0 ){
$nameElement = $nameNode[0]->getElementsByTagName('NameElement');
if ( $nameElement->length > 0 ) {
$ultimateHoldingCompany = $nameElement[0]->nodeValue;
}
}
$idNode = $newNode->getElementsByTagName('IdentifierElement');
if ( $idNode->length > 0 ){
$id = $idNode[0]->nodeValue;
}
fputs($fo, $name.",".$id.",".$ultimateHoldingCompany.PHP_EOL);
}
}
fclose($fo);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.