使用php从具有多个命名元素的文件中删除xml元素
嗨 我正在处理一个xml文件,该文件的结构如下使用php从具有多个命名元素的文件中删除xml元素,php,xml,parsing,Php,Xml,Parsing,嗨 我正在处理一个xml文件,该文件的结构如下 <ListRecords> <record> </record> <totalupnow> </totalupnow> <record> </record> <record> </record> <record> </record> <record> </record> <to
<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先前询问的元素。我要求你理解文件的格式,然后指导我。亲爱的,我不是要你做我所有的工作。我能理解。所以求你了@穆罕默德,我不知道你输入的确切格式,因为你出于某种原因没有在你的问题中提供它。下一次的提示:如果你想要一个特定问题的特定答案,问一个特定的问题。如果这听起来很刺耳,很抱歉,但是你现在花时间说服我回到画板上,因为你最好从一开始就确切地问你想知道什么。