2017-05-22 1 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에서 하나의 유사한 키만 할당 할 수 있음) 속성을 저장하기 위해, 이것은 $를위한 것입니다. (디폴트)를 사용하여 배열을 생성하거나 이것을 해제 할 수 있습니다. mergeAttrs를 사용하면 원하는 결과를 얻을 수 있습니다.

attrkey가 하나의 솔루션 일 경우 변경할 수 있습니다. charkey와 같은 일도 마찬가지입니다. GitHub의 README에있는 https://github.com/Leonidas-from-XIV/node-xml2js에서 전체 구성 옵션을 찾을 수 있습니다. 결국 어린이에게 변형 될 수있는 옵션이 적합 할 수도 있습니다.

속성을 전혀 필요로하지 않으면 ignoreAttrs = true를 설정할 수 있습니다. 그건 그렇고. 파서 옵션은 파서 생성자에 객체로 전달됩니다. 새 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) 
관련 문제