如何处理PHP xml_parse的“无效字符”错误?

How to handle "invalid character" errors with PHP xml_parse?

提问人:Pascal Polleunus 提问时间:11/8/2023 更新时间:11/8/2023 访问量:42

问:

在解析从受信任的第三方收到的文件时,我遇到了由无效的 HTML 实体引起的错误(请参阅下面的奇怪事情)。Invalid character (error code: 9)

我该如何处理这种问题?(以便文件仍被解析)
例如,只需删除无效字符即可。

由于我需要处理大文件(50MB),因此我正在使用.因此,在将部分 read () 传递给 XML 解析器之前检查/清理该部分是不安全的。fread()$data

$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, FALSE);
xml_set_element_handler($parser, "startElement", "endElement"); 
xml_set_character_data_handler($parser, "characterData"); 

$fp = fopen($file, "rb");
while ($data = fread($fp, 4096)) {
  if (!xml_parse($parser, $data, feof($fp))) {
    $errorCode = xml_get_error_code($parser);
    printf(
      "XML Parser: %s (error code: %d). File: %s, line %d, column %d.",
      xml_error_string($errorCode),
      $errorCode,
      $file,
      xml_get_current_line_number($parser),
      xml_get_current_column_number($parser),
    );
  }
}

3件奇怪的事情:

  1. 我在 4 个文件(共 24 个)中遇到了同样的问题。
    所有这些有问题的文件在 2 个不同的行上都有 2 倍的无效字符。
    错误消息始终相同,表示第一次出现的行号(两行的内容实际上相同,因此列也相同,这是正常的,但可能是错误的)。

  2. 相同的错误消息显示次数过多。
    文件1:126.38KB,4次。档案2:11.70MB,4次。档案3: 36.64MB, 70倍.文件4:4.55MB,96次。
    注意:在每个文件之后调用。无论如何,PHP > 8.0.0,所以不再需要了。
    xml_parser_free($parser); $parser = NULL;

  3. 错误消息指示错误的 (?) 列号。
    该行的相关部分是 。
    无效字符位于第 325 列,但错误消息显示 312(即“技术”中的“e”)。
    excellent technical knowhow in design

php xml xml解析 无效字符

评论


答: 暂无答案