0

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>   

Occupation TAG が「Student」のレコードだけを含めて、それらの結果を CSV ファイルに書き込みたいと考えています。

preg_match( "/\(.*?)\</PersonalInfo>/s", $data, $match ); として preg_match を試しました。タグを選択してから $match を調べますが、二重の値 (繰り返し) を返しています。

4

1 に答える 1

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";
        }
    }
}
于 2012-08-16T07:45:17.520 に答える