2017-05-22 13 views
0

xmlをjsonに解析しようとしています&私はnodejsでxml2jsを使用しています。私は以下の出力を取得していますxmlをjsonに正しく解析できない

<?xml version="1.0" encoding="UTF-8" ?> 
<ALEXA> 
    <SD TITLE="A" FLAGS="" HOST="davidwalsh.name"> 
     <TITLE TEXT="David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else"/> 
     <LINKSIN NUM="1102"/> 
     <SPEED TEXT="1421" PCT="51"/> 
    </SD> 
    <SD> 
     <POPULARITY URL="davidwalsh.name/" TEXT="7131"/> 
     <REACH RANK="5952"/> 
     <RANK DELTA="-1648"/> 
    </SD> 
</ALEXA> 

{ 
    "ALEXA": { 
    "SD": [ 
     { 
     "$": { 
      "TITLE": "A", 
      "FLAGS": "", 
      "HOST": "davidwalsh.name" 
     }, 
     "TITLE": [ 
      { 
      "$": { 
       "TEXT": "David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else" 
      } 
      } 
     ], 
     "LINKSIN": [ 
      { 
      "$": { 
       "NUM": "1102" 
      } 
      } 
     ], 
     "SPEED": [ 
      { 
      "$": { 
       "TEXT": "1421", 
       "PCT": "51" 
      } 
      } 
     ] 
     }, 
     { 
     "POPULARITY": [ 
      { 
      "$": { 
       "URL": "davidwalsh.name/", 
       "TEXT": "7131" 
      } 
      } 
     ], 
     "REACH": [ 
      { 
      "$": { 
       "RANK": "5952" 
      } 
      } 
     ], 
     "RANK": [ 
      { 
      "$": { 
       "DELTA": "-1648" 
      } 
      } 
     ] 
     } 
    ] 
    } 
} 

'$'、解析されたJSONに追加取得され 以下は私のコード

var chai = require('chai'); 
var chaiHttp = require('chai-http'); 
var request = chai.request; 
var should = chai.should(); 
var expect = chai.expect; 
var assert = chai.assert; 
var supertest = require('supertest'); 
var fs = require('fs'); 
var xmlLocation = "./configdata/xmlDoc.xml"; 

var xml2js = require('xml2js'); 
var parser = new xml2js.Parser(); 

//Plugin for HTTP, etc. 
chai.use(chaiHttp); 
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; 

//xmlFile = JSON.parse(fs.readFileSync(xmlData, 'utf8')); 


describe("Test : ", function() { 

    it("convert xml to json", function (done) { 

     r = fs.readFileSync(xmlLocation, 'UTF-8'); 
     parser.parseString(r, function (err, parsedData) { 
      if (err) throw err; 
      else { 
       fs.writeFile("jsonData.json", JSON.stringify(parsedData), function (err, response) { 
       }); 
      } 
     }); 

     done(); 
    }); 

}) 

私のサンプルXMLファイルです。それを避ける方法.. ??

解決策を探しています。前もって感謝します。

答えて

0

$はデフォルトの設定の属性の場所です。

xml2jsはXMLタグ(例:SD)を配列として明示的に解析します(explicitArray = true - 複数のものがあり、JSONのオブジェクトごとに1つの類似するキーしか割り当てることができません)属性を格納するには、これは$のためのものです。 (デフォルトの)配列の作成を強制することも、これをオフにすることもできます。 mergeAttrsを使用すると、結果的に結果が得られる可能性があります。

attrkeyを変更することもできます。これが1つの解決策でもあります。同じことがcharkeyなどにも当てはまります。あなたはGitHubのREADMEにあるhttps://github.com/Leonidas-from-XIV/node-xml2jsにconfigオプション全体を見つけることができます。最終的には、子供たちに変身するオプションがあなたのために正しいかもしれません。

属性がまったく必要ない場合は、ignoreAttrs = trueを設定できます。ところで;パーサオプションは、あなたのケースではパーサーコンストラクタにオブジェクトとして渡されます:new xml2js.Parser({... options});

+0

実際、私はこのプラットフォームでは非常に新しいので、サンプルコードスニペットは私の人生を楽にしてくれます。 –

+0

もちろん:-) あなたはvar parser = new xml2js.Parser()を持っています。あなたのコードでは、あなたのパーサーインスタンスを作成します。 Parserのコンストラクタでは、var parser = new xml2js.Parser({optionName:optionValue})のようにoptionsオブジェクトを渡すことができます。 利用可能なオプションは、私が投稿したGitHub READMEにあります。だからあなたのニーズに応じてXMLを解析するには、私はオプションで少し演奏します。しかし関連性はおそらくvar parser = new xml2js.Parser({mergeAttrs:true、attrkey: 'ANYTHINGELSE'})です。 - XMLをJSONにどのようにパースするか(追加することができますか?) – Severin

0

このようなライブラリは、通常、すべてを解析し、必要でない多くのプロパティを持つことがあります。

私はこの目的でcamaroを作成しました。

欠けているのは、XMLを変換する構造のテンプレートファイルを作成する必要があることです。

const transform = require('camaro') 
const fs = require('fs') 

const xml = fs.readFileSync('ean.xml', 'utf-8') 
const template = { 
    cache_key: "/HotelListResponse/cacheKey", 
    hotels: ["//HotelSummary", { 
     hotel_id: "hotelId", 
     name: "name", 
     rooms: ["RoomRateDetailsList/RoomRateDetails", { 
      rates: ["RateInfos/RateInfo", { 
       currency: "ChargeableRateInfo/@currencyCode", 
       non_refundable: "nonRefundable", 
       price: "ChargeableRateInfo/@total" 
      }], 
      room_name: "roomDescription", 
      room_type_id: "roomTypeCode" 
     }] 
    }], 
    session_id: "/HotelListResponse/customerSessionId" 
} 

const result = transform(xml, template) 
関連する問題