在PHP程序中 $xm是正确的变量名,php – 问题 – 仅在文档​​开头允许XML声明

这篇博客介绍了两种使用PHP处理大文件中XML记录的方法。第一种方法使用了`fopen`、`fgets`和`XMLReader`来逐行读取文件并解析XML元素。第二种方法通过逐字节读取文件,寻找XML标签开始和结束的标志,从而避免一次性加载整个文件。这两种方法对于处理大型XML文件都具有一定的效率。
摘要由CSDN通过智能技术生成

确保第一个标签前没有任何空白区域.

尝试这个:

//Declarations

$file = "data.txt"; //The file to read from.

#Read the file

$fp = fopen($file, "r"); //Open the file

$data = ""; //Initialize variable to contain the file's content

while(!feof($fp)) //Loop through the file, read it till the end.

{

$data .= fgets($fp, 1024); //append next kb to data

}

fclose($fp); //Close file

#End read file

$split = preg_split('/(?<=)(?!$)/', $data); //Split each xml occurence into its own string

foreach ($split as $sxml) //Loop through each xml string

{

//echo $sxml;

$reader = new XMLReader(); //Initialize the reader

$reader->xml($sxml) or die("File not found"); //open the current xml string

while($reader->read()) //Read it

{

switch($reader->nodeType)

{

case constant('XMLREADER::ELEMENT'): //Read element

if ($reader->name == 'record')

{

$dataa = $reader->readInnerXml(); //get contents for tag.

echo $dataa; //Print it to screen.

}

break;

}

}

$reader->close(); //close reader

}

?>

将$file变量设置为所需的文件.注意我不知道这对4gb文件有多好.告诉我,如果没有.

编辑:

这是另一种解决方案,它应该更好地使用更大的文件(在读取文件时解析).

set_time_limit(0);

//Declarations

$file = "data.txt"; //The file to read from.

#Read the file

$fp = fopen($file, "r") or die("Couldn't Open"); //Open the file

$FoundXmlTagStep = 0;

$FoundEndXMLTagStep = 0;

$curXML = "";

$firstXMLTagRead = false;

while(!feof($fp)) //Loop through the file, read it till the end.

{

$data = fgets($fp, 2);

if ($FoundXmlTagStep==0 && $data == "

$FoundXmlTagStep=1;

else if ($FoundXmlTagStep==1 && $data == "x")

$FoundXmlTagStep=2;

else if ($FoundXmlTagStep==2 && $data == "m")

$FoundXmlTagStep=3;

else if ($FoundXmlTagStep==3 && $data == "l")

{

$FoundXmlTagStep=4;

$firstXMLTagRead = true;

}

else if ($FoundXmlTagStep!=4)

$FoundXmlTagStep=0;

if ($FoundXmlTagStep==4)

{

if ($firstXMLTagRead)

{

$firstXMLTagRead = false;

$curXML = "

}

$curXML .= $data;

//Start trying to match end of xml

if ($FoundEndXMLTagStep==0 && $data == "

$FoundEndXMLTagStep=1;

elseif ($FoundEndXMLTagStep==1 && $data == "/")

$FoundEndXMLTagStep=2;

elseif ($FoundEndXMLTagStep==2 && $data == "x")

$FoundEndXMLTagStep=3;

elseif ($FoundEndXMLTagStep==3 && $data == "m")

$FoundEndXMLTagStep=4;

elseif ($FoundEndXMLTagStep==4 && $data == "l")

$FoundEndXMLTagStep=5;

elseif ($FoundEndXMLTagStep==5 && $data == ">")

{

$FoundEndXMLTagStep=0;

$FoundXmlTagStep=0;

#finished Reading XML

ParseXML ($curXML);

}

elseif ($FoundEndXMLTagStep!=5)

$FoundEndXMLTagStep=0;

}

}

fclose($fp); //Close file

function ParseXML ($xml)

{

//echo $sxml;

$reader = new XMLReader(); //Initialize the reader

$reader->xml($xml) or die("File not found"); //open the current xml string

while($reader->read()) //Read it

{

switch($reader->nodeType)

{

case constant('XMLREADER::ELEMENT'): //Read element

if ($reader->name == 'record')

{

$dataa = $reader->readInnerXml(); //get contents for tag.

echo $dataa; //Print it to screen.

}

break;

}

}

$reader->close(); //close reader

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值