大型XML文件在PHP中解析块数据过滤

时间:2012-08-16 04:48:38

标签: php xml regex xml-parsing

我有一个超过100 MB的大型XML文件。我正在以这样的方式阅读文件

  

$ fp = fopen('large.xml','r');

     

while($ data = fread($ fp,4096)){

XML的格式是这样的

<PersonalInfo>
    <UserDetail>
       <FirstName>ABC</FirstName>
       <Occupation>Student</Occupation>
       <DateOfBirth>08/14/1999</DateOfBirth>
    </UserDetail>
    <CaseDetail>....</CaseDetail>
    <TransactionDetail>....</TransactionDetail>
</PersonalInfo>      
<PersonalInfo>
    <UserDetail>
       <FirstName>XYZ</FirstName>
       <Occupation>Student</Occupation>
       <DateOfBirth>04/25/1991</DateOfBirth>
     </UserDetail>
     <CaseDetail>....</CaseDetail>
     <TransactionDetail>.....</TransactionDetail>
</PersonalInfo>      
<PersonalInfo>
    <UserDetail>
        <FirstName>DEF</FirstName>
        <Occupation>Teacher</Occupation>
        <DateOfBirth>05/12/1984</DateOfBirth>
    </UserDetail>
    <CaseDetail>....</CaseDetail>
    <TransactionDetail>...</TransactionDetail>
</PersonalInfo>   

我想只包含占用标记为“学生”的记录,并将这些结果写入CSV文件。

我已经尝试过preg_match preg_match(“/\(.*?)\</PersonalInfo>/s”,$ data,$ match); 选择标签,然后查看$ match但它返回双值(重复)。

1 个答案:

答案 0 :(得分:0)

首先通过以下链接检查您的xml是否有效:

http://www.xmlformatter.net/

如果您的xml有效,请执行以下操作:

$dom = new DOMDocument('1.0', 'UTF-8');

$dom->formatOutput = true;
@$dom->load('large.xml');
$tags = $dom->getElementsByTagName('PersonalInfo');

foreach ($tags as $destination) {

    foreach($destination->childNodes as $child) {
        if ($child->textContent == "Student") {
          echo "Write code to create csv file";
        }
    }
}