我是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”
由于
答案 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);