通过计算非属性来删除xml元素

时间:2015-05-25 09:23:52

标签: xml

您好我有一个超大的xml文件(40+ GB)。简化的结构是

<xml>
    <element>111</element>
    <element>222</element>
    <element>333</element>
    <element>444</element>
    <element>555</element>
    <element>666</element>
    ...
</xml>

我尝试删除2,000,000个元素,但我不知道该元素的内容。我有办法这样做吗?搜索了几个小时但只找到了基于属性的xml查询。谢谢!

2 个答案:

答案 0 :(得分:0)

如果您使用的是UNIX,并且知道该文件始终采用该格式,则使用sed可能最容易。

sed -e '2000001d' infile > outfile

如果您需要解析实际的XML结构,可以考虑xml-sed

答案 1 :(得分:0)

假设您要删除前五个element。首先,获取第一个开头<element>的行。

$ opening=$(grep -n '<element>' < x.xml | head -1 | cut -d: -f1)

然后获得第五个结束</element>的行。

$ closing=$(grep -n '</element>' < x.xml | head -n5 | tail -1 | cut -d: -f1)

现在删除从openingclosing的行。

$ sed "${opening},${closing}d" < x.xml

输出:

<xml>
    <element>666</element>
</xml>

如果您不确定XML文件的格式,请使用xmllint进行清理。

$ xmllint -format x.xml