Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用快速XML解析器将解析的XML展平_Javascript_Arrays_Node.js_Xml_Fast Xml Parser - Fatal编程技术网

Javascript 如何使用快速XML解析器将解析的XML展平

Javascript 如何使用快速XML解析器将解析的XML展平,javascript,arrays,node.js,xml,fast-xml-parser,Javascript,Arrays,Node.js,Xml,Fast Xml Parser,我继承了一个需要维护的Node.js应用程序,这不是我的强项 我们正在使用快速XML解析器解析XML,它可以很好地处理大多数输入。然而,我们有一些额外的输入深度,我们需要将输出平展到相同的水平 输入:其中价格值是额外的深度 <products capture-installed="true"> <script/> <script/> <script/> <product> <pid>8</pid> <mod

我继承了一个需要维护的Node.js应用程序,这不是我的强项

我们正在使用快速XML解析器解析XML,它可以很好地处理大多数输入。然而,我们有一些额外的输入深度,我们需要将输出平展到相同的水平

输入:其中价格值是额外的深度

<products capture-installed="true">
<script/>
<script/>
<script/>
<product>
<pid>8</pid>
<modelno>6273033</modelno>
<name>
<![CDATA[ Big Red Truck ]]>
</name>
<category>
<![CDATA[ Toys]]>
</category>
<currency>USD</currency>
<price>
  <actualprice>19.20</actualprice>
</price>
</product>
但我们需要的是:

   "product": {
      "pid": "8",
      "modelno": "6273033",
      "name": "Big Red Truck",
      "category": "Toys",
      "currency": "USD",
      "price-actualprice": "19.20"
      }
当前代码:

const parse = require("fast-xml-parser");

const options = {
  ignoreAttributes : true,
  ignoreNameSpace : false,
  parseNodeValue : false,
  tagValueProcessor : a => {
    if(Array.isArray(a)){
      return a.join(',');
    }
    return a;
  }
};

const flatten = (data) => {
  return data.map(row => {
    const fieldNames = Object.keys(row);
    for (const fieldName of fieldNames) {
      if(Array.isArray(row[fieldName])){
        row[fieldName] = row[fieldName].join(',');
      }

      if(typeof row[fieldName] === 'object'){
        row[fieldName] = JSON.stringify(row[fieldName]);
      }
    }
    return row;
  });
};


function findTheArray(o) {
  if(Array.isArray(o)){
    return o;
  }
  var result, p; 
  for (p in o) {
      if( o.hasOwnProperty(p) && typeof o[p] === 'object' ) {
          result = findTheArray(o[p]);
          if(result){
              return result;
          }
      }
  }
  return result;
}


module.exports = function parseData(data) {
  return new Promise((resolve, reject) => {
    try {
      const isValid = parse.validate(data);
      if (isValid === true) {
        const pData = parse.parse(data, options);
        const array = findTheArray(pData);
        if(array){
          resolve(flatten(array));
        } else {
          reject('Can\'t find any goodies!');
        }
      } else {
        reject(isValid.err);
      }
    } catch (err) {
      reject(err);
    }
  });
};
我曾在代码的这一领域工作过,但没有取得任何成功:

if(typeof row[fieldName] === 'object'){
        row[fieldName] = JSON.stringify(row[fieldName])
想法?
感谢

当前代码”返回的结果将与上面显示的结果不同-
产品。价格显然不是字符串,因此不是JSON。但是结果显示我们得到了:pid=8 modelno=6273033 etc price={“actualprice”:“19.20”}这是应用程序在屏幕上的价格字段中给出的结果。但是我们只需要price=19.20或price-actualprice=19.20(不管字段名最终是什么)}
if(typeof row[fieldName] === 'object'){
        row[fieldName] = JSON.stringify(row[fieldName])