无法解析 xml - 错误:第一个标记前的非空白。行:0 列:1 字符:4

问题描述 投票:0回答:6

我正在写一个简单的原子包。当我发送请求时,服务器会做出 xml 响应,因此我尝试使用 xml2js 对其进行解析。但是出现错误:

错误:第一个标签前没有空格。行:0 列:1 字符:4

err

我该如何解决? 提前谢谢你。

部分代码:

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)
xml-parsing coffeescript
6个回答
1
投票

应该在 xml2js 中一次性修复,但目前似乎没有。不幸的是,Benjamin 的回答 对我不起作用。我暂时强烈建议dos2unix

就像

dos2unix file
一样简单。

如果您使用的是 OSX,请执行

brew install dos2unix
。在 RHEL 相关的发行版(Fedora、Red Hat、CentOS)上尝试为其他发行版做
dnf install dos2unix
,等等。


0
投票

罪魁祸首是所谓的字节顺序标记 (BOM),这是一个 3 字节的“零宽度不间断空格”Unicode 字符,Windows 系统会自动将其添加到 UTF-8 文件中。使用十六进制编辑器检查文件时,BOM 显示为十六进制

EFBBBF
.

解决问题:

var cleanedString = origString.replace("\ufeff", "");

有关更多信息,请参阅本文


0
投票

在我的例子中,我使用了 node-soap 和 express,对于 express,我有主体解析器将所有输入解析为 json:

bodyparser.json()

但是,与 SOAP 请求相反,我们需要发送 xml,所以我又添加了一个正文解析器,如下所示:

app.use(bodyParser.text({type:'text/*'}));

祝你好运:)


0
投票

我有同样的问题,我检查了我的 xml 文件,发现第一行有一个字符串非 xml。我删除了这条线,它对我来说很好用。

我正在使用 npm lib 将 xml 解析为 json

看截图


0
投票

我遇到了同样的问题。我将某个标签(可以说是“结果”)作为参数传递,经过测试我发现 api 没有在不正确的请求上返回所述标签,因此出现错误。

我的 xmlToJson 函数如下:-

var result = this.xmlToJson(xmlString, 'result');

我对成功的 API 响应是这样的:-

<response>
 <result>
   everything else
 </result>
</response>

失败时,它是这样的:-

<response/>

没有结果标签导致上述错误。

编辑:- 为了解决上述错误并获得失败响应,我用 try-catch 块包装了 xmlToJson 函数,并在 catch 块上返回了失败消息


0
投票

我遇到过类似的问题。我意识到 xml 文件的编码是 utf-16,这导致了这个错误。将文件重新保存为 utf-8 编码并再次运行代码对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.