大容量(> 2GB)XMLファイルからノードを削除する方法は?

大容量(> 2GB)XMLファイルからノードを削除する方法は?

私は複数の大容量(> 2 GB)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> 各レコードで、作業するのに十分小さいファイルサイズを大幅に減らすことができます。

このようなタスクを実行する最良の方法は何ですか?

sed私はほとんどの「XML対応」ユーティリティをこれらの大容量ファイルに対して試しましたgrep

答え1

awkを使用できます。

$cat my.xml | awk '/<b>/{hide=1} /<\/record>/ {hide=0} {if (hide==0) print;}' >mynew.xml

これにより、インクルード行以降のすべての内容が非表示になり、インクルード<b>行から始まります。</record>

あなたの意見によると、XMLが1つの大きな行である場合は、複数行に分割して変換を完了した後に改行を削除してください。

$cat my.xml|sed 's/>/>\n/g'| awk ....... | tr -d '\n' >.....

XMLを捨ててYAMLまたはJSONを試してみてください!

答え2

個人的には、私はアセンブリの前に最も低いレベル(C)で作業を実行し、libxmlを使用してすべてのノードを繰り返します。

ここにいくつかの例があります。http://www.xmlsoft.org/examples/

GCCを使用してコードをコンパイルします。

関連情報