Как извлечь из ответа только XML - PullRequest
0 голосов
/ 19 июня 2020

У меня есть приложение NodeJS / Electron в качестве сервера-слушателя. IP-камера ANPR отправляет POST-запрос с информацией о тревоге на указанный сервер, затем я хочу, чтобы указанный сервер обрабатывал возврат XML.

Однако, поскольку в блоке есть текст и другие различные капли, возвращаемые в блоке, я Я нахожусь в точке, где я не уверен, что мне нужно сделать, чтобы очистить его. Я приложу копию тела запроса и свою функцию http.createServer.

Все, что мне нужно, это часть XML, чтобы я мог проанализировать и продолжить работу.

HTTP-сервер function:

var port = 7200;

http.createServer((request, response) => {
  const { headers, method, url } = request;
  let body = [];

  request.on('error', (err) => {
    console.error(err);
  }).on('data', (chunk) => {
    body.push(chunk);
  }).on('end', () => {

    body = Buffer.concat(body).toString();

    response.on('error', (err) => {
      console.error(err);
    });

    console.log(body);

    response.statusCode = 200;

    response.end();

    // END OF NEW STUFF
  });
}).listen(port);

console.log(`Server listening on port ${port}`);

Это работает нормально, запросы поступают.

Это часть body Я хотел бы проанализировать только XML из:

---------------------------7e13971310878\r\nContent-Disposition: form-data; name=\"anpr.xml\";filename=\"anpr.xml\";\r\nContent-Type: text/xml\r\nContent-Length: 2827\r\n\r\n


<EventNotificationAlert version=\"2.0\" xmlns=\"http://www.isapi.org/ver20/XMLSchema\">\r\n
    <ipAddress>192.168.5.43</ipAddress>\r\n
    <ipv6Address>::</ipv6Address>\r\n
    <portNo>7200</portNo>\r\n
    <protocol>HTTP</protocol>\r\n
    <macAddress>98:df:82:37:1d:5e</macAddress>\r\n
    <channelID>1</channelID>\r\n
    <dateTime>2020-06-19T15:10:13+00:00</dateTime>\r\n
    <activePostCount>2</activePostCount>\r\n
    <eventType>ANPR</eventType>\r\n
    <eventState>active</eventState>\r\n
    <eventDescription>ANPR</eventDescription>\r\n
    <channelName>ANPR Exit</channelName>\r\n
    <ANPR>\r\n
        <licensePlate>01MH8551</licensePlate>\r\n
        <line>1</line>\r\n
        <direction>forward</direction>\r\n
        <confidenceLevel>99</confidenceLevel>\r\n
        <plateType>unknown</plateType>\r\n
        <plateColor>other</plateColor>\r\n
        <licenseBright>112</licenseBright>\r\n
        <pilotsafebelt>unknown</pilotsafebelt>\r\n
        <vicepilotsafebelt>unknown</vicepilotsafebelt>\r\n
        <pilotsunvisor>unknown</pilotsunvisor>\r\n
        <vicepilotsunvisor>unknown</vicepilotsunvisor>\r\n
        <envprosign>unknown</envprosign>\r\n
        <dangmark>unknown</dangmark>\r\n
        <uphone>unknown</uphone>\r\n
        <pendant>unknown</pendant>\r\n
        <tissueBox>unknown</tissueBox>\r\n
        <label>unknown</label>\r\n
        <decoration>unknown</decoration>\r\n
        <plateCharBelieve>100,100,100,100,100,100,100,100</plateCharBelieve>\r\n
        <speedLimit>0</speedLimit>\r\n
        <illegalInfo>\r\n
            <illegalCode>0</illegalCode>\r\n
        </illegalInfo>\r\n
        <vehicleType>truck</vehicleType>\r\n
        <featurePicFileName>1</featurePicFileName>\r\n
        <detectDir>0</detectDir>\r\n
        <detectType>3</detectType>\r\n
        <barrierGateCtrlType>0</barrierGateCtrlType>\r\n
        <alarmDataType>0</alarmDataType>\r\n
        <dwIllegalTime>0</dwIllegalTime>\r\n
        <vehicleInfo>\r\n
            <index>2</index>\r\n
            <vehicleType>2</vehicleType>\r\n
            <colorDepth>2</colorDepth>\r\n
            <color>unknown</color>\r\n
            <speed>0</speed>\r\n
            <length>0</length>\r\n
            <vehicleLogoRecog>0</vehicleLogoRecog>\r\n
            <vehileSubLogoRecog>0</vehileSubLogoRecog>\r\n
            <vehileModel>0</vehileModel>\r\n
        </vehicleInfo>\r\n
        <pictureInfoList>\r\n
            <pictureInfo>\r\n
                <fileName>licensePlatePicture.jpg</fileName>\r\n
                <type>licensePlatePicture</type>\r\n
                <dataType>0</dataType>\r\n
            </pictureInfo>\r\n
            <pictureInfo>\r\n
                <fileName>detectionPicture_1.jpg</fileName>\r\n
                <type>licensePlatePicture</type>\r\n
                <dataType>0</dataType>\r\n
                <vehicleHead>back</vehicleHead>\r\n
                <redLightTime>0</redLightTime>\r\n
                <absTime>20200619151013606</absTime>\r\n
                <plateRect>\r\n
                    <X>29697</X>\r\n
                    <Y>59648</Y>\r\n
                    <width>17664</width>\r\n
                    <height>6400</height>\r\n
                </plateRect>\r\n
            </pictureInfo>\r\n
            <pictureInfo>\r\n
                <fileName>detectionPicture_2.jpg</fileName>\r\n
                <type>licensePlatePicture</type>\r\n
                <dataType>0</dataType>\r\n
                <vehicleHead>back</vehicleHead>\r\n
                <redLightTime>0</redLightTime>\r\n
                <absTime>20200619151013608</absTime>\r\n
                <plateRect>\r\n
                    <X>29697</X>\r\n
                    <Y>59648</Y>\r\n
                    <width>17664</width>\r\n
                    <height>6400</height>\r\n
                </plateRect>\r\n
            </pictureInfo>\r\n
        </pictureInfoList>\r\n
    </ANPR>\r\n
    <UUID>fa41feec-1dd1-11b2-9e33-944acfe73596</UUID>\r\n
    <picNum>3</picNum>\r\n
    <monitoringSiteID></monitoringSiteID>\r\n
    <deviceID>88</deviceID>\r\n
</EventNotificationAlert>

---------------------------7e13971310878\r\nContent-Disposition: form-data;name=\"licensePlatePicture.jpg\";filename=\"licensePlatePicture.jpg\";\r\nContent-Type:

Ответы [ 3 ]

0 голосов
/ 21 июня 2020

Похоже, вам нужно изолировать данные XML от остальных данных запроса. Вы можете оценить каждый chunk при срабатывании события data и только блоки pu sh, содержащие открывающий и закрывающий xml тег EventNotificationAlert. Затем вам нужно будет проанализировать эту строку xml (xmlStr) на объект JSON или любой другой формат, который вам нужен. Вот обновленный код:

var port = 7200;
var xmlStr = '';
http.createServer((request, response) => {
  const { headers, method, url } = request;
  let body = [];

  request.on('error', (err) => {
    console.error(err);
  }).on('data', (chunk) => {
    // Convert the chunk which is a Buffer object to a string primitive
    let chunkStr = chunk.toString();
    // If the chunk string contains the opening or closing xml tag...
    if (chunkStr.indexOf('<EventNotificationAlert')!= -1 || chunkStr.indexOf('</EventNotificationAlert')) {
        xmlStr += chunkStr; // ...append the chunk string to xmlStr
    }
    body.push(chunk);
  }).on('end', () => {
    body = Buffer.concat(body).toString();

    response.on('error', (err) => {
      console.error(err);
    });

    console.log(xmlStr); // should output just the xml response as a string

    response.statusCode = 200;

    response.end();

    // END OF NEW STUFF
  });
}).listen(port);

console.log(`Server listening on port ${port}`);
0 голосов
/ 25 июня 2020

Чтобы заставить это работать, я использовал пакет под названием Busboy. Затем он проанализировал загруженные файлы, и я смог отсортировать файлы.

См. Ниже мой новый HTTP-прослушиватель.

var inspect = util.inspect;

var Busboy = require('busboy');

http.createServer(function(req, res) {
  if (req.method === 'POST') {
    //vars
    var ref = Math.random().toString(36).substring(5) + Math.random().toString(36).substring(2, 15);;
    var xml = '';
    var parseXml = '';
    var over1, over2 = '';
    var i = 0;

    var busboy = new Busboy({ headers: req.headers });
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
      console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype);
      if(filename.toLowerCase() === "licenseplatepicture.jpg")
      {
        var saveTo = config.App.ImageDir+"/"+ref+"_Plate.jpg";
        if (!fs.existsSync(saveTo)) {
          //file exists
          file.pipe(fs.createWriteStream(saveTo));
        }
      }
      if(filename.toLowerCase() === "detectionpicture.jpg")
      {
        i++;
        var saveTo = config.App.ImageDir+"/"+ref+"_Front_"+i+".jpg";
        if (!fs.existsSync(saveTo)) {
          //file exists
          file.pipe(fs.createWriteStream(saveTo));
        }
      }
      file.on('data', function(data) {
        if(filename.toLowerCase() === "anpr.xml")
        {
          xml += data;
        }
        console.log('File [' + fieldname + '] got ' + data.length + ' bytes');
      });
      file.on('end', function() {
        console.log('File [' + fieldname + '] Finished');
      });
    });
    busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) {
      console.log('Field [' + fieldname + ']: value: ' + inspect(val));
      // No fields according to busboy
    });
    busboy.on('finish', function() {
      // DO PARSE INTO JSON! This works, all is well.
      xml2js.parseString(xml, {explicitArray:false, ignoreAttrs:true}, function (err, result)
      {
        if(err)
        {
          alert('Parse: '+err);
        }
        // Set parsed var
        parseXml = result;
      });
      var images = '';
      if(i = 2)
      {
        images = `{"Plate":"${ref}_Plate.jpg", "Front":"${ref}_Front_1.jpg", "Overview":"${ref}_Front_2.jpg"}`;
      } else {
        images = `{"Plate":"${ref}_Plate.jpg", "Front":"${ref}_Front_1.jpg", "Overview":"null"}`;
      }
      // Once parsed, send on to ANPR listen function.
      ANPR_ListenData(ref, parseXml, images, function(result) {
        if(result.Status == 1)
        {
          console.log('Data transfered for: '+parseXml.EventNotificationAlert.ANPR.licensePlate);
          console.log('Accepted Camera: '+result.Example);
          res.writeHead(200, { Connection: 'close', Location: '/' });
          res.end();
        }
      });
    });
    req.pipe(busboy);
  }
}).listen(7200, function() {
  console.log('Listening for requests');
});


Спасибо за поддержку, очень признательны. Райан

0 голосов
/ 19 июня 2020

Просто взглянув на это сначала, можно понять следующее:

body2 = body.split('\n'); //Split string into array on newlines. If its already an array, try join before this
body2.splice(0,4); //Remove first 4 elements
body2.splice(-2,2); //remove last 2 elements
body = body2.join('\n'); //Convert back into a string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...