Xml
如何從 HUGE (>2gb) XML 文件中刪除節點?
我正在處理幾個巨大的 (>2gb) XML 文件,它們的大小導致了問題。
(我的應用程序在 PHP 腳本中使用 XMLReader 來解析較小的約 500mb 文件,並且工作正常,但 XMLReader 不會打開這些大文件。)
所以 - 我的想法是消除我知道我不需要的文件的大父節點。
例如,如果文件的結構如下所示:
<record id="1"> <a> <detail>blah</detail> .... <detail>blah</detail> </a> <b> <detail>blah</detail> .... <detail>blah</detail> </b> <c> <detail>blah</detail> .... <detail>blah</detail> </c> </record> ... <record id="999999"> <a> <detail>blah</detail> .... <detail>blah</detail> </a> <b> <detail>blah</detail> .... <detail>blah</detail> </b> <c> <detail>blah</detail> .... <detail>blah</detail> </c> </record>
出於我的目的 - 我只需要每條記錄
<a>
的父節點中的數據。如果我可以從每條記錄中消除父節點,我可以大大減小文件的大小,因此它足夠小,可以正常使用。<b>``<c>
做這樣的事情的最好方法是什麼?
我嘗試過的大多數“XML 感知”實用程序都會在這麼大的文件上窒息,所以我希望我可以使用類似
sed
or的東西來做到這一點grep
。
您可以使用 awk:
$cat my.xml | awk '/<b>/{hide=1} /<\/record>/ {hide=0} {if (hide==0) print;}' >mynew.xml
這將隱藏自包含的行以來的所有內容,並以包含
<b>
的行開始顯示</record>
根據您的評論,如果您的 XML 是一大行 - 只需將其拆分為行並在完成轉換後刪除換行符。
$cat my.xml|sed 's/>/>\n/g'| awk ....... | tr -d '\n' >.....
扔掉 xml,開始使用 YAML 或 JSON!
個人而言,我會在 C 中做一些事情(在組裝之前可能處於最低級別)並使用 libxml 循環遍歷所有節點。
以下是一些範例:http ://www.xmlsoft.org/examples/
使用 GCC 編譯您的程式碼。