我使用HXT解析使用http-conduit进行的HTTP调用的XML响应体。
val <- runX $ readString [withValidate no] (Data.ByteString.UTF8.toString . toStrict $ getResponseBody response) >>> getChildren >>> ...
根据API的版本,我发现响应体在XML之前包含一个字节顺序标记:
error: ""\65279<?xml version=\"1.0\" encoding=\"utf-8\"?><Enume..."" (line 1, column 1):
unexpected "\65279"
expecting xml declaration, comment, processing instruction, "<!DOCTYPE" or "<"
由于BOM可能在那里,也可能不在那里,我做了以下事情:
...
let resBody = Data.ByteString.UTF8.toString . toStrict $ getResponseBody response
parseBody body = runX $ readString [withValidate no] body >>> getChildren >>> ...
xs <- parseBody resBody
val <- case xs of
x : _ -> pure x
_ -> head <$> (parseBody $ drop 1 resBody)
...
它工作正常,但在BOM表存在时打印错误消息。有哪些选项可以解析带有可能的BOM的XML,使其不打印错误消息?
1条答案
按热度按时间dgenwo3n1#
好的,假设你愿意假设编码是UTF-8,那么最简单的方法可能就是模式匹配来丢弃BOM:
顺便说一句,在浏览了XML规范以了解编码应该如何处理之后,让我说一下:恶心似乎没有与编码无关的方法来指定使用什么编码,所以唯一真正正确、健壮的做法是在解析过程中尝试一堆,并希望其中一个成功。