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

时间:2017-09-24 10:47:58

标签: php xml

我是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文件: my xml file

最后,我的期望是打印“UltimateHoldingCompanyName”,“OrganisationName”,“NameElement”

由于

2 个答案:

答案 0 :(得分:1)

如果文件很大,那么SimpleXML没有多大用处,因为它需要将整个文件加载到内存中。相反,您应该使用像XMLReader

这样的拉解析器

答案 1 :(得分:0)

由于你没有给我们足够的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);