从 XML 流中删除无效字符
Removing invalid characters from XML stream
我正在 Python 中使用 SAX 解析 XML 文件。 XML 通过 urllib.request.
从 HTTP 流中读取
XML 流似乎包含无效字符。具体来说,当从 UTF-8 解码并将其转储到文件时,看起来我得到了一堆“8000”的实例,前后都有换行符。
这会导致 SAX 解析失败。
我的问题是双重的:
- 如何删除或忽略出现在 urllib.request 数据流中的无效字符?
- “8000”可能是什么,是否有针对该问题的更具体的修复方法?
[编辑]
我无法共享源数据,但这是字符串和十六进制的前几个字符。第一个字符是违规的“8000”字符。
字符串:
8000<?xml
十六进制:
38:30:30:30:3c:3f:78:6d:6c:20
“8000”字符串可以搜索替换,但这不是一个好的解决方案,因为数据可能包含该相当常见的字符串。
<?xml
是 XML 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 端口从字节流中删除,并且不存在进一步的编码问题。
我正在 Python 中使用 SAX 解析 XML 文件。 XML 通过 urllib.request.
从 HTTP 流中读取XML 流似乎包含无效字符。具体来说,当从 UTF-8 解码并将其转储到文件时,看起来我得到了一堆“8000”的实例,前后都有换行符。 这会导致 SAX 解析失败。
我的问题是双重的:
- 如何删除或忽略出现在 urllib.request 数据流中的无效字符?
- “8000”可能是什么,是否有针对该问题的更具体的修复方法?
[编辑]
我无法共享源数据,但这是字符串和十六进制的前几个字符。第一个字符是违规的“8000”字符。
字符串:
8000<?xml
十六进制:
38:30:30:30:3c:3f:78:6d:6c:20
“8000”字符串可以搜索替换,但这不是一个好的解决方案,因为数据可能包含该相当常见的字符串。
<?xml
是 XML 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 端口从字节流中删除,并且不存在进一步的编码问题。