2012-05-28 55 views
3

格式的XML的:如何使用PHP解析具有多個xml聲明的xml文件? (幾個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的不同文件。

任何幫助,將不勝感激。 謝謝..

+0

這裏的讀者通常喜歡在提問之前看到一些先前的研究,只是你知道。但是,您可能希望使用XMLReader等「流式閱讀器」,而不是將文檔完全加載到內存中的文檔,如SimpleXML。 – halfer

+0

我已經有解析代碼。只是腳本不會解析下一個根節點。無論如何感謝您的反饋 –

+0

您的文件不被視爲有效。 http://stackoverflow.com/questions/5479533/problem-xml-declaration-allowed-only-at-the-start-of-the-document你可以使用str_replace刪除額外的聲明http://stackoverflow.com/questions/2159059 /用php替換字符串中的大文件然後從有效的XML文檔開始工作。 – baptme

回答

2

如果你不想拆分文件,你將不得不在內存中使用它。鑑於您的500MB文件大小,這可能會變成問題。無論如何,一個辦法是從所有文件刪除XML序言和的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') 
     ) 
    ) 
); 

這將使一個巨大的XML文件只是一個XML序言和一個的DocType(注我假設DocType對文件中的所有文檔都是相同的)。然後,您可以通過遍歷各個根元素來處理文件。

+0

我使用XML閱讀器,因爲我正在解析一個大的XML文件。您可以幫助我使用與XML閱讀器配合使用的等效代碼嗎?因爲我通過流或字節讀取xml。謝謝。 –

+0

感謝您的想法。我只是在通過文件進行流式傳輸時添加了一個主根,並刪除了xml標記和文檔類型。我現在工作。 –

+0

這適用於我的一個100MB文件,代碼運行約5秒鐘。請注意,您將不得不使用以下內容爲PHP分配更多內存:ini_set('memory_limit','768M'); – markashworth