Node JS Чтение нескольких XML Файл - PullRequest
0 голосов
/ 02 мая 2020

Я новичок в Node JS Stream и не знаю, правильно ли я его использую. Проблема У меня есть структура каталогов внутри, у меня есть подпапка, которая имеет кучу XML файла. Например, внутри у меня есть файл 50 xml или может быть больше. Я перебираю все подпапки и читаю все файлы xml. Для этого я использую NodeJS Stream. ниже два усеченных xml файла. Я использую пакет xml - js npm для преобразования содержимого объекта xml в js.

Файл 1 -

<?xml version="1.0" encoding="UTF-8"?>
    <jcr:root
         xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
         xmlns:cq="http://www.day.com/jcr/cq/1.0"
         xmlns:jcr="http://www.jcp.org/jcr/1.0"
         xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
         description="Lorem Ipsum"
         title="Lorem Ipsum Title">
     <sub-item
         type="string"
         description="Lorem Ipsum" />

    </jcr:root>

Файл 2-

    <?xml version="1.0" encoding="UTF-8"?>
    <jcr:root
         xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
         xmlns:cq="http://www.day.com/jcr/cq/1.0"
         xmlns:jcr="http://www.jcp.org/jcr/1.0"
         xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
         description="Lorem Ipsum 2"
         title="Lorem Ipsum Title Two">
     <sub-item
         type="string"
         description="Lorem Ipsum Sub Item" />

    </jcr:root>

Вот мой NodeJS Код

// file = it is a variable that hold an array of all the xml file,
For Eg: - [file1.xml, file2.xml]
// Using xml-js npm package to convert XML to JS Object

let d = {
    data: []
};
for (let i = 0; i < file.length; i++) {
   const streamXMLFile = fs.createReadStream(file[i]);

   streamXMLFile.on('data', (chunk) => {
        d.data.push(chunk.toString());
   });

   streamXMLFile.on('end', () => {
      const result = convert.xml2js(d.data, {compact: true, spaces: 4});
      const attributes = result["jcr:root"] ? result["jcr:root"]: '';
             console.log("a", attributes);
        });
 }

Фактический результат

// Data that is returning is coming as it own Object For Eg Like below

a {
      _attributes : {
             'xmlns:sling': 'http://sling.apache.org/jcr/sling/1.0',
             'xmlns:cq': 'http://www.day.com/jcr/cq/1.0',
             'xmlns:jcr': 'http://www.jcp.org/jcr/1.0',
             'xmlns:nt': 'http://www.jcp.org/jcr/nt/1.0',
             description="Lorem Ipsum",
             title="Lorem Ipsum Title" 
       },
   'sub-item': {
       _attributes: {
             type:"string"
             description:"Lorem Ipsum"
        }
   }
 }


a {
      _attributes : {
             'xmlns:sling': 'http://sling.apache.org/jcr/sling/1.0',
             'xmlns:cq': 'http://www.day.com/jcr/cq/1.0',
             'xmlns:jcr': 'http://www.jcp.org/jcr/1.0',
             'xmlns:nt': 'http://www.jcp.org/jcr/nt/1.0',
             description="Lorem Ipsum",
             title="Lorem Ipsum Title Two" 
       },
   'sub-item': {
       _attributes: {
             type:"string"
             description:"Lorem Ipsum Sub Item"
        }
   }
 }

Ожидаемый результат Необходимо объединить все данные в один массив объекта Как ниже. Я попробовал несколько других вариантов, но не смог попробовать object.assign, но не работает. Не знаю, правильно ли я поступаю или нет.

let Obj = [{
       _attributes : {
           'xmlns:sling': 'http://sling.apache.org/jcr/sling/1.0',
           'xmlns:cq': 'http://www.day.com/jcr/cq/1.0',
           'xmlns:jcr': 'http://www.jcp.org/jcr/1.0',
           'xmlns:nt': 'http://www.jcp.org/jcr/nt/1.0',
           description="Lorem Ipsum",
           title="Lorem Ipsum Title"
        },
       'sub-item': {
           _attributes: {
              type:"string"
              description:"Lorem Ipsum"
           }
        }
      },
      {
           _attributes : {
               'xmlns:sling': 'http://sling.apache.org/jcr/sling/1.0',
               'xmlns:cq': 'http://www.day.com/jcr/cq/1.0',
               'xmlns:jcr': 'http://www.jcp.org/jcr/1.0',
               'xmlns:nt': 'http://www.jcp.org/jcr/nt/1.0',
               description="Lorem Ipsum",
               title="Lorem Ipsum Title Two"
           },
          'sub-item': {
              _attributes: {
                  type:"string"
                  description:"Lorem Ipsum Sub Item"
              }
           }
     }]

Может кто-нибудь? Пожалуйста, покажите мне правильное направление, что я делаю неправильно, и поправьте меня.

...