Xml

如何從 HUGE (>2gb) XML 文件中刪除節點?

  • April 16, 2019

我正在處理幾個巨大的 (>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 感知”實用程序都會在這麼大的文件上窒息,所以我希望我可以使用類似sedor的東西來做到這一點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 編譯您的程式碼。

引用自:https://unix.stackexchange.com/questions/156291