从 XML 流中删除无效字符

Removing invalid characters from XML stream

我正在 Python 中使用 SAX 解析 XML 文件。 XML 通过 urllib.request.

从 HTTP 流中读取

XML 流似乎包含无效字符。具体来说,当从 UTF-8 解码并将其转储到文件时,看起来我得到了一堆“8000”的实例,前后都有换行符。 这会导致 SAX 解析失败。

我的问题是双重的:

  1. 如何删除或忽略出现在 urllib.request 数据流中的无效字符?
  2. “8000”可能是什么,是否有针对该问题的更具体的修复方法?

[编辑]

我无法共享源数据,但这是字符串和十六进制的前几个字符。第一个字符是违规的“8000”字符。

字符串:

8000<?xml

十六进制:

38:30:30:30:3c:3f:78:6d:6c:20

“8000”字符串可以搜索替换,但这不是一个好的解决方案,因为数据可能包含该相当常见的字符串。

<?xmlXML declaration.

的开始

在一个 XML 文档中最多只能有一个 XML 声明,并且它可能只出现在文件的第一部分。对于前面的“8000”,呈现 XML 文档而不是 well-formed。在尝试将此流解析为 XML 之前,您必须确保存在的 XML 声明不超过一个,并且之前没有任何内容。这必须在 character/string/text 级别完成 – 而不是 XML 级别。

另见 Error: The processing instruction target matching "[xX][mM][lL]" is not allowed

似乎代码向 XML 解析器提供了来自 urllib.request.urlopen 发送的 HTTPResponse(即 HTTPResponse.fp)的文件解析器对象,而不仅仅是 HTTPResponse。由于某种原因,这导致端口 (8000) 被写入 BufferedReader 的每个缓冲块中。 这似乎是从 Python 2 迁移到 3 引起的问题(可能 HTTPResponse 对象在 Python 2 中的行为不同)。

通过直接向 XML 解析器提供 HTTPResponse 而不是 response.fp 端口从字节流中删除,并且不存在进一步的编码问题。