Разбор XML в JSON UTF-8 - PullRequest
       26

Разбор XML в JSON UTF-8

0 голосов
/ 07 июня 2018

Я использую 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

Ответьте за скручивание к «реальному» источнику (это запрос 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

1 Ответ

0 голосов
/ 07 июня 2018

Я настроил несколько файлов сценариев для репликации ваших результатов ... Судя по всему, все работает нормально.

Я создал сервер экспресс-обслуживания для обслуживания статического файла 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> download.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

для моей установки.

...