Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.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
使用php从具有多个命名元素的文件中删除xml元素_Php_Xml_Parsing - Fatal编程技术网

使用php从具有多个命名元素的文件中删除xml元素

使用php从具有多个命名元素的文件中删除xml元素,php,xml,parsing,Php,Xml,Parsing,嗨 我正在处理一个xml文件,该文件的结构如下 <ListRecords> <record> </record> <totalupnow> </totalupnow> <record> </record> <record> </record> <record> </record> <record> </record> <to

嗨 我正在处理一个xml文件,该文件的结构如下

<ListRecords>
    <record>
</record>

<totalupnow> </totalupnow>

<record>
</record>
<record>
</record>
<record>
</record>
<record>
</record>
<totalupnow> </totalupnow>

</listrecord>
现在我需要一个php程序,它只是从这个文件中删除。。该文件的大小非常大,几乎为4 gbs

请帮帮我

或者如果有,我只能从中读取,保持原样。

您可以使用来解析这样的文件。它的工作原理与DOM解析器略有不同,但在exchange中,它可以处理任何大小的文件

[…]或者如果有,我只能读

为了简单起见,我假设您的元素只包含文本,而read意味着将其内容写入屏幕

<?php 
$file       = "your_big_file.xml"; 
$xml_parser = xml_parser_create(); 

// set up some basic parser properties
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0); 
xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1); 

// set up your event handlers    
xml_set_element_handler($xml_parser, "startElement", "endElement"); 
xml_set_character_data_handler($xml_parser, "contents"); 

// read the file in 4kb chunks and parse these as they are read
while ($data = fread($fp, 4096)) { 
  if (!xml_parse($xml_parser, $data, feof($fp))) { 
    die( sprintf("XML error: %s at line %d", 
         xml_error_string(xml_get_error_code($xml_parser)), 
         xml_get_current_line_number($xml_parser))); 
  } 
} 

// clean up
xml_parser_free($xml_parser); 

// EVENT HANDLERS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$in_record = false;
$counter   = 0;
$depth     = 0;

// this function is called whenever a start element (<foo>) is encountered
function startElement($parser, $name, $attrs) { 
  global $in_record; 
  global $depth; 
  global $counter;

  $depth++; 
  $in_record = ($name == "record");

  if ($in_record) {
    $counter++;
    echo "Record #$counter:\n"; 
  }
} 

// this function is called whenever a start element (</foo>) is encountered
function endElement($parser, $name) { 
  global $in_record; 
  global $depth; 

  $depth--; 
  $in_record = ($name != "record");
} 

// this function is called whenever text data is encountered
function contents($parser, $data) { 
  global $in_record; 

  if ($in_record) {
    echo "\t".$data."\n"; 
  }
} 

?>

您可能不想为此使用PHP。PHP通常试图将整个文件加载到内存中,这显然是个坏主意。您可以通过使用fgets和write逐行复制文件来使用变通方法,但这会很麻烦。更好的方法是使用更适合您的目标的编程语言/shell脚本/工具,例如sed。元素中有什么?字符数据?更多元素?@dtech:你不是真的建议正则表达式在这里解析XML,是吗?PHP非常适合通过SAX实现这一点……我使用的是PHP xml dom解析器。。它工作得很好,但当它到达记录后,它就会停止…还有一件事,当文件很大时,它也会停止。请帮帮我,我只是被这个文件绊倒了很长一段时间:@Tomalak我在帖子里有没有提到regex?但我不知道SAX@Muhammad我不明白那个评论。还有,你真的试过使用我的建议吗?因为我不想为你解决整个问题。事实上,我想如果我把文件发给你,你就可以准确地理解文件的格式。求你了,我只是累了。与此合作近一个月,但没有任何收获。请帮帮我。@Muhammad把文件寄给我?对不起,没有。我的例子很直截了当,你的问题很模糊,我不想为你做所有的工作。我正在尝试这个例子,但我认为你不知道文件的确切格式。正如u hv先前询问的元素。我要求你理解文件的格式,然后指导我。亲爱的,我不是要你做我所有的工作。我能理解。所以求你了@穆罕默德,我不知道你输入的确切格式,因为你出于某种原因没有在你的问题中提供它。下一次的提示:如果你想要一个特定问题的特定答案,问一个特定的问题。如果这听起来很刺耳,很抱歉,但是你现在花时间说服我回到画板上,因为你最好从一开始就确切地问你想知道什么。