javascipt, подстрока из длинной строки html - PullRequest
0 голосов
/ 07 февраля 2020

Мне нужно экстраполировать из строки, содержащей много повторяющихся тегов html, и экстраполировать только несколько, например:

<objid> 1234 </objid> ..... * other tags * ...... <name> myname </name> .. * other tags * .. <objid> 5678 </objid> .... * other tags * ....

Я хотел бы вставить только 1234 и мое имя и 5678 et c в одной строке.

 var mySubString = responseString.substring(responseString.lastIndexOf("<objid>") +7, responseString.lastIndexOf("</objid>")); 

, поэтому я пытаюсь получить данные с сайта, и он возвращает идентификатор, имя и статус, и я хотел бы напечатать строку следующим образом : 'object' + id1 + name1 + 'находится в состоянии' + "state1" + '\ n' + 'object' + id2 + name2 + 'находится в состоянии' + "state2" + '\ n' + et c .... он должен повторяться до конца строки html заканчивается

edit:

stato':function(){
    var responseString = '';
    var mythis=this;
    //REM: Stores the result
    var tResult = [];

    https.get('https://'+ xxxxx +'/api/xxxxxxx?content=xxxxx&output=xml&columns=objid,status&count=10&&username=xxx'&passhash=xxx', (res) => {
        console.log('statusCode:', res.statusCode);
        console.log('headers:', res.headers);



      res.on('data', (d) => {responseString += d;
      //  var mySubString="";
     var tFragment = document.createElement('div');
    tFragment.innerHTML = responseString;


    for(var i=0, j=tFragment.querySelectorAll('objid').length; i<j; i++){
      tResult.push(
         'Il sensore @objid./* @name.*/ è nello stato @state.'
            .replace('@objid.', tFragment.querySelectorAll('objid')[i].textContent)
           // .replace('@name.', tFragment.querySelectorAll('name')[i].textContent)
            .replace('@status.', tFragment.querySelectorAll('status')[i].textContent)
      )
    };


   });
       res.on('end', function(res)
        {
            //const speechOutput = responseString;
            console.log('==> Answering: ',tResult);
            mythis.emit(':tell', tResult);
        });
    }).on('error', (e) => {
  console.error(e);
});
},

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Я подозреваю, что вы на самом деле пытаетесь разобрать какую-то форму XML и что упомянутые вами поля заключены в какую-то другую запись. например,

<record>
   <objid>1235</objid>
   <name>A name</name>
   <status>Some status info</status>
</record>

Какой-то XML синтаксический анализатор, вероятно, является ответом

0 голосов
/ 07 февраля 2020

Вы можете добавить «HTML» к div и получить доступ к textContent всему или отдельным элементам.

//REM: Fake HTML
var tFakeHTML = '<tag1>value1</tag1><tag2>value2</tag2>';

//REM: Adding it to a div as innerHTML
var tFragment = document.createElement('div');
tFragment.innerHTML = tFakeHTML;

//REM: Returning values
console.log('tag1: ', tFragment.querySelector('tag1').textContent);
console.log('tag2: ', tFragment.querySelector('tag2').textContent);

//REM: Returning all as a string
console.log('string', tFragment.textContent)

на практике я пытаюсь получить данные с сайта, и он возвращает идентификатор, имя и статус, и я хотел бы напечатать строку следующим образом: 'object' + id1 + name1 + 'находится в состоянии' + "state1" + '\ n' + 'object' + id2 + name2 + 'находится в состоянии' + "state2" + '\ n' + et c .... он должен повторяться до конца строки html заканчивается

//REM: Fake HTML
var tFakeHTML = '<id>id1</id><name>name1</name><state>state1</state><id>id2</id><name>name2</name><state>state2</state>';

//REM: Adding it to a div as innerHTML
var tFragment = document.createElement('div');
tFragment.innerHTML = tFakeHTML;

//REM: Stores the result
var tResult = [];

//REM: It would be easier if each pair (id, name, state) had a wrapper/parentNode. Yet is it not clear from the example. This also will not work if an element is missing in a pair.
for(var i=0, j=tFragment.querySelectorAll('id').length; i<j; i++){
  tResult.push(
     'object @id. @name. is in state @state.'
        .replace('@id.', tFragment.querySelectorAll('id')[i].textContent)
        .replace('@name.', tFragment.querySelectorAll('name')[i].textContent)
        .replace('@state.', tFragment.querySelectorAll('state')[i].textContent)
  )
};

//REM: Returning all as a string
console.log(tResult.join('\n'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...