繁体   English   中英

使用PHP解析大型(约10 GB)的嵌套XML文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM