【问题标题】:Parsing XML to JSON UTF-8将 XML 解析为 JSON UTF-8
【发布时间】:2018-11-17 02:44:55
【问题描述】:

我正在使用 xml2js,因为我需要将 XML 提要转换为 JSON。 但是当我收到 XML 时,它会按预期显示 Æ、Ø 和 Å。但是解析之后。

我收到: Ø 为 \ufffd 或 �。

我已经将编码设置为 UTF-8,所以我不确定我做错了什么。谁能启发我:-)?

var fs = require('fs')
var https = require('https')
var xml2js = require('xml2js')
var parser = new xml2js.Parser()

router.get('/api/xml', (req, res) => {
  https.get('urlForRequest', function (response) {
    var response_data = '';     

    response.setEncoding('utf8');
    response.on('data', function (chunk) {
         response_data += chunk;             
    });
    response.on('end', function () {
      parser.parseString(response_data, function (err, result) {
        if (err) {
          console.log('Got error: ' + err.message);
        } else {
          res.json(result)
        }
      });
    });
    res.on('error', function (err) {
      console.log('Got error: ' + err.message);
    })
  })
})

更新:

我尝试按照您的步骤进行操作。如果我获取 XML 并将其存储在本地的 .xml 文件中,一切都会很好。但是如果我从我的源(完全相同的 GET 请求)获取它,那么它就不起作用了。

响应 curl http://localhost:9090/products.xml -v > download.xml

Connected to localhost (::1) port 9090 (#0)
GET /products.xml HTTP/1.1
Host: localhost:9090
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 200 OK
X-Powered-By: Express
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Thu, 07 Jun 2018 09:56:41 GMT
ETag: W/"9471b6-163d9ad4696"
Content-Type: text/xml; charset=UTF-8
Content-Length: 9728438
Date: Thu, 07 Jun 2018 10:00:09 GMT
Connection: keep-alive

将 curl 响应到“真实”源(如果重要,这是一个 https 请求)

User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 200 OK
Date: Thu, 07 Jun 2018 10:10:29 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/xml; charset=iso-8859-1

【问题讨论】:

    标签: javascript json node.js express xml2js


    【解决方案1】:

    我已经设置了一些脚本文件来复制您的结果。从我所见,一切似乎都正常。

    我创建了一个快速服务器来提供包含 ÅØ 字符的静态 XML 文件。这始终是解决这些问题、隔离问题的好地方。

    server.js

    const express = require("express");
    const app = express();
    const port = 3000;
    
    app.use('/', express.static(__dirname));
    app.listen(port);
    
    console.log('Express started on port ' + port + '...');
    

    index.js

    const xml2js = require('xml2js')
    const parser = new xml2js.Parser()
    const http = require('http');
    
    var url = 'http://localhost:3000/test.xml';
    
    http.get(url, (response) => {
    
        var response_data = '';     
        // Try latin1 encoding.
        response.setEncoding('latin1');
        response.on('data', function (chunk) {
             response_data += chunk;             
        });
        response.on('end', function () {
          parser.parseString(response_data, function (err, result) {
            if (err) {
              console.log('Got error: ' + err.message);
            } else {
              console.log('Result JSON: ', JSON.stringify(result, null, 4));
            }
          });
        });
    
    });
    

    test.xml

    <root>
        <testÅØ id="198787">
        </testÅØ>
    </root>
    

    所有文件都在同一个目录中。启动 server.js 然后 index.js,这应该会下载测试 xml 文件并显示解析结果。使用我的设置,我得到以下输出:

    {
        "root": {
            "testÅØ": [
                {
                    "$": {
                        "id": "198787"
                    }
                }
            ]
        }
    }
    

    我想知道原始 XML 文件是否存在问题。 我会尝试使用 curl 下载数据并查看文件的外观,例如

    curl urlForRequest -v > 下载.xml

    我会检查返回的标题,我得到了

    curl http://localhost:3000/test.xml -v > download.xml
    
    HTTP/1.1 200 OK
    X-Powered-By: Express
    Accept-Ranges: bytes
    Cache-Control: public, max-age=0
    Last-Modified: Thu, 07 Jun 2018 09:10:31 GMT
    ETag: W/"34-163d982ff58"
    Content-Type: text/xml; charset=UTF-8
    Content-Length: 52
    Date: Thu, 07 Jun 2018 09:52:46 GMT
    Connection: keep-alive
    

    对于我的设置。

    【讨论】:

    • 我可以看到真实文件的编码是 iso-8859-1,我敢打赌这是问题所在!
    • 有什么建议,如何解决?
    • 也许试试这个:response.setEncoding("latin1");我会更新我的答案。文件的编码是不是 UTF-8,所以我们应该试试别的!
    • 太棒了!服务器确实应该使用 utf8,但这是一个很好的解决方法!
    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 2012-11-07
    • 2015-07-22
    • 2013-07-14
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多