使用PHP的XML读取脚本不完全读取某些元素

使用PHP的XML读取脚本不完全读取某些元素,php,xml,Php,Xml,我有一个XML数据源URL,使用fread从中读取数据。它包含学生信息,我正从中提取成绩并将其编译成数组 问题是,当我在本地运行此脚本时,它工作正常,并且在数组中正确列出/收集所有等级。但是,当我在共享服务器上运行此脚本时,除了正常的成绩名称(例如,ergarten)之外,我还得到一些错误读取的成绩。完整的年级名称也记录在数组中,这意味着仅读取特定元素时存在问题 我想到的第一个疑点是fread字节长度。我把它改成了8192,但运气不好 以下是php文件中的相关代码块: if (!($xml_pa

我有一个XML数据源URL,使用fread从中读取数据。它包含学生信息,我正从中提取成绩并将其编译成数组

问题是,当我在本地运行此脚本时,它工作正常,并且在数组中正确列出/收集所有等级。但是,当我在共享服务器上运行此脚本时,除了正常的成绩名称(例如,ergarten)之外,我还得到一些错误读取的成绩。完整的年级名称也记录在数组中,这意味着仅读取特定元素时存在问题

我想到的第一个疑点是fread字节长度。我把它改成了8192,但运气不好

以下是php文件中的相关代码块:

if (!($xml_parser = xml_parser_create())) die("Couldn't create parser.");
xml_set_element_handler( $xml_parser, "startElementHandler", "endElementHandler");
xml_set_character_data_handler( $xml_parser, "characterDataHandler");

while( $data = fread($fp, 8192)){ 
if(!xml_parse($xml_parser, $data, feof($fp))) {
break;}}
xml_parser_free($xml_parser);

有什么想法吗?

我发现了问题,自己解决了

问题在于,在使用fread以块形式读取数据的循环中,我同时使用XML解析器转换数据,这导致了问题,因为数据流并不总是具有完整的标记。我从该点删除了解析器,以便仅当脚本读取了所有数据时才运行它


这就解决了问题。

SAX是读取XML最困难的方法——它是最基本的API。如果XML文件非常大,请尝试使用DOM或XMLReader。使用DOM,您可以获得Xpath,并可以使用表达式从XML树中获取节点。谢谢,但是您能帮我找到脚本在本地和远程服务器上不同行为的原因吗?它在本地工作,所以我希望它也能远程工作。这是一个不同的问题,为了使它更有效,我一定会考虑XMLRead或DOM。