我正在写一个简单的原子包。当我发送请求时,服务器会做出 xml 响应,因此我尝试使用 xml2js 对其进行解析。但是出现错误:
错误:第一个标签前没有空格。行:0 列:1 字符:4
我该如何解决? 提前谢谢你。
部分代码:
module.exports = class HatenaBlogPost
~~~
@hatenaBlogPost = new HatenaBlogPost()
~~~
postEntry: (callback) ->
draft = if @isPublic then 'no' else 'yes'
requestBody = """
<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom"
xmlns:app="http://www.w3.org/2007/app">
<title>#{@entryTitle}</title>
<author><name>#{@getHatenaId()}</name></author>
<content type="text/plain">
#{_.escape(@entryBody)}
</content>
<updated>#{moment().format('YYYY-MM-DDTHH:mm:ss')}</updated>
<app:control>
<app:draft>#{draft}</app:draft>
</app:control>
</entry>
"""
options =
hostname: 'blog.hatena.ne.jp'
path: "/#{@getHatenaId()}/#{@getBlogId()}/atom/entry"
auth: "#{@getHatenaId()}:#{@getApiKey()}"
method: 'POST'
request = https.request options, (res) ->
res.setEncoding "utf-8"
body = ''
res.on "data", (chunk) ->
body += chunk
res.on "end", ->
callback(body)
request.write requestBody
request.end()
景色:
{parseString} = require 'xml2js'
~~~
@hatenaBlogPost.postEntry (response) =>
parseString response, (err, result) =>
if err
atom.notifications.addError("#{err}", dismissable: true)
else
entryUrl = result.entry.link[1].$.href
entry_Title = result.entry.title
atom.notifications.addSuccess("Posted #{entry_Title} at #{entryUrl}", dismissable: true)
这 应该在 xml2js 中一次性修复,但目前似乎没有。不幸的是,Benjamin 的回答 对我不起作用。我暂时强烈建议dos2unix。
就像
dos2unix file
一样简单。
如果您使用的是 OSX,请执行
brew install dos2unix
。在 RHEL 相关的发行版(Fedora、Red Hat、CentOS)上尝试为其他发行版做dnf install dos2unix
,等等。
罪魁祸首是所谓的字节顺序标记 (BOM),这是一个 3 字节的“零宽度不间断空格”Unicode 字符,Windows 系统会自动将其添加到 UTF-8 文件中。使用十六进制编辑器检查文件时,BOM 显示为十六进制
EFBBBF
.
解决问题:
var cleanedString = origString.replace("\ufeff", "");
有关更多信息,请参阅本文。
在我的例子中,我使用了 node-soap 和 express,对于 express,我有主体解析器将所有输入解析为 json:
bodyparser.json()
但是,与 SOAP 请求相反,我们需要发送 xml,所以我又添加了一个正文解析器,如下所示:
app.use(bodyParser.text({type:'text/*'}));
祝你好运:)
我遇到了同样的问题。我将某个标签(可以说是“结果”)作为参数传递,经过测试我发现 api 没有在不正确的请求上返回所述标签,因此出现错误。
我的 xmlToJson 函数如下:-
var result = this.xmlToJson(xmlString, 'result');
我对成功的 API 响应是这样的:-
<response>
<result>
everything else
</result>
</response>
失败时,它是这样的:-
<response/>
没有结果标签导致上述错误。
编辑:- 为了解决上述错误并获得失败响应,我用 try-catch 块包装了 xmlToJson 函数,并在 catch 块上返回了失败消息
我遇到过类似的问题。我意识到 xml 文件的编码是 utf-16,这导致了这个错误。将文件重新保存为 utf-8 编码并再次运行代码对我有用。