haskell HXT:处理HTTP响应体的字节顺序标记

jvlzgdj9  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(200)

我使用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,使其不打印错误消息?

dgenwo3n

dgenwo3n1#

好的,假设你愿意假设编码是UTF-8,那么最简单的方法可能就是模式匹配来丢弃BOM:

case toString ... of
    '\65279':s -> s
    s -> s

顺便说一句,在浏览了XML规范以了解编码应该如何处理之后,让我说一下:恶心似乎没有与编码无关的方法来指定使用什么编码,所以唯一真正正确、健壮的做法是在解析过程中尝试一堆,并希望其中一个成功。

相关问题