我有一個很大的XML文件,大於100MB,我想檢查這個文件的結構是否有效。如何檢查大xml文件的有效性?
我可以試着用DOMDocument
加載這個文件;例如,我可以使用PHP XML解析器讀取它,它可以「讓您解析但不驗證XML文檔」。
有沒有辦法做到這一點,而無需將XML文件完全加載到內存中?
我有一個很大的XML文件,大於100MB,我想檢查這個文件的結構是否有效。如何檢查大xml文件的有效性?
我可以試着用DOMDocument
加載這個文件;例如,我可以使用PHP XML解析器讀取它,它可以「讓您解析但不驗證XML文檔」。
有沒有辦法做到這一點,而無需將XML文件完全加載到內存中?
首先,你不會說你使用什麼樣的模式進行驗證:DTD,XSD,RelaxNG?
其次,你提到PHP,但你沒有說解決方案是否必須基於PHP。例如,你可以使用Java嗎?
一般來說,根據模式驗證XML文檔是一種流式操作,它不需要在內存中構建XML文檔的樹形表示。找到一個在你的環境中工作的流驗證器應該不難,但是我們需要知道環境是什麼(以及你使用的是什麼模式語言)。
想想你在說什麼。你想對不在內存中的數據進行操作。這根本沒有意義......如果你想從操作中引用它,它最終必須在內存中。
如果你不想一次加載數據到內存中,你可以採取分而治之的方法。如果該文件非常大,則可以在多個進程中運行map reduce作業,但這不會減少使用的內存量。
如果您只想檢查XML結構是否有效,則可以使用PHP的XML解析器。它不會根據DTD驗證文檔,這就意味着它不會驗證。
所有這些error codes都可以在解析XML結構無效的情況下返回。
我認爲您需要查看XMLReader類。更具體地說, XMLReader::setSchema。
您是否有XML模式來驗證您的文件?如果是這樣,[DOMDocument :: schemaValidate](http://www.php.net/manual/en/domdocument.schemavalidate.php)函數可能是你想要的。 –
@JonahBishop我認爲他應該改爲使用XMLReader。 DOMDocument將嘗試首先將整個文件加載到內存中。 –
有趣的一點,@MihaiTodor。我沒有意識到這一點。 –