Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于从大型(>;2gb)XML文件中删除节点的实用工具_Xml_Xml Parsing - Fatal编程技术网

用于从大型(>;2gb)XML文件中删除节点的实用工具

用于从大型(>;2gb)XML文件中删除节点的实用工具,xml,xml-parsing,Xml,Xml Parsing,我正在处理几个大的(>2gb)XML文件,它们的大小导致了一些问题 (例如,我在PHP脚本中使用XMLReader来解析较小的~500mb文件,这很好,但是是32位PHP) 所以-我的想法是消除文件中我知道不需要的大块 例如,如果文件的结构如下所示: <record id="1"> <a> <detail>blah</detail> .... <detail>blah</de

我正在处理几个大的(>2gb)XML文件,它们的大小导致了一些问题

(例如,我在PHP脚本中使用XMLReader来解析较小的~500mb文件,这很好,但是是32位PHP)

所以-我的想法是消除文件中我知道不需要的大块

例如,如果文件的结构如下所示:

<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>

废话
....
废话
废话
....
废话
废话
....
废话
...
废话
....
废话
废话
....
废话
废话
....
废话
出于我的目的-我只需要每个记录的父节点
中的数据。如果我可以从每个记录中删除父节点
,我就可以大大减小文件的大小,这样它就足够小,可以正常工作

这样做的最佳方式是什么(最好是使用
sed
grep
或免费/便宜的应用程序)


我尝试过Altova XML Spy的试用版,但它甚至无法打开XML文件(我想这是因为它太大了)。

既然您提到了
sed
awk
,我想您是在linux下

如果您有xsltproc实用程序

提供测试文件的更正版本

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="project.xsl" type="text/xsl"?>

<records>
<record id="1">
    <a>
        <detail>hello</detail>
        bar
        <detail>world</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>
        foo
        <detail>blah blah</detail>
    </a>
    <b>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </b>
    <c>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </c>
</record>
</records>
会是

<?xml version="1.0"?>
<records><record id="1"><a>
        <detail>hello</detail>
        bar
        <detail>world</detail>
    </a></record><record id="999999"><a>
        <detail>blah</detail>
        foo
        <detail>blah blah</detail>
    </a></record></records>

你好
酒吧
世界
废话
福
废话

这接近您的预期吗?

您想要的是SAX解析器而不是DOM解析器。我相信您使用的是如此大的XML。如果是这样,您正在使用technology@Tomalak-谢谢你的评论,但我不能使用XMLReader-它不会打开文件。我正在寻找一个实用程序,它可以删除我知道不需要的节点,这样我就可以将一个2.5gb的文件减少到XMLReader给出的错误是什么?或者,值得一试。我强烈建议您重新考虑您的建议,即使用一个不支持XML的实用程序,如
sed
awk
来减少文件的大小。有些解析器是用来处理这些文件大小的,你应该使用这样的工具。。。在任何XML工具都能干净地处理它之前,您必须先解决这个问题。
xsltproc extract.xsl  record.xml
<?xml version="1.0"?>
<records><record id="1"><a>
        <detail>hello</detail>
        bar
        <detail>world</detail>
    </a></record><record id="999999"><a>
        <detail>blah</detail>
        foo
        <detail>blah blah</detail>
    </a></record></records>