3

XML の形式:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE >
<root>
 <node>
  <element1></element1>
  <element2></element2>
  <element3></element2>
  <element4></element3>  
</node>
</root>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE >
<root>
 <node>
  <element1></element1>
  <element2></element2>
  <element3></element2>
  <element4></element3>  
</node>
</root>

その後、さらにいくつかの xml 宣言が続きます。ところで、ファイルサイズは500MBです。PHP を使用して、このファイルを別のファイルに分割せずに解析する方法を教えてください。

どんな助けでも大歓迎です。ありがとうございました..

4

1 に答える 1

2

ファイルを分割したくない場合は、メモリ内で作業する必要があります。500MB のファイル サイズを考えると、これは問題になる可能性があります。とにかく、1 つのオプションは、すべてのドキュメントから XML Prolog と DocType を削除してから、次のようにすべてをロードすることです。

$dom = new DOMDocument;
$dom->loadXML(
    sprintf(
        '<?xml version="1.0" encoding="UTF-8"?>%s' .
        '<!DOCTYPE >%s' . 
        '<roots>%s</roots>',
        PHP_EOL, 
        PHP_EOL, 
        str_replace(
            array(
                '<?xml version="1.0" encoding="UTF-8"?>', 
                '<!DOCTYPE >'
            ),
            '',
            file_get_contents('/path/to/your/file.xml')
        )
    )
);

これにより、1 つの XML プロローグと 1 つの DocType だけを持つ 1 つの巨大な XML ファイルになります (ファイル内のすべてのドキュメントで DocType が同じであると想定していることに注意してください)。その後、個々のルート要素を反復処理してファイルを処理できます。

于 2012-05-28T08:10:17.537 に答える