简体   繁体   English

Xml使用xml2js解析问题

[英]Xml parsing problems using xml2js

I need to parse huge XML data and insert the values in a mySQL table. 我需要解析巨大的XML数据并将值插入到mySQL表中。

My XML data is in this form, 我的XML数据是这种格式,

<BMS version="1.0">
<Summaries>
<Summary Booking_strId="CWBL00D7CB8J8U" Booking_lngId="466244159" Trans_lngId="466244159" App_strCode="WEBIN" Event_strType="CT" Trans_dtmBookingStamp="Mon, 30 Jun, 2014 @ 7:00pm" Trans_dtmBookingDate="Mon, 30 Jun, 2014" Trans_dtmBookingTime="7:00pm" Trans_mnyTicketsTotal="7000.0000" Trans_mnyTicketsBookingFee="224.7200" Trans_mnyTicketsDeliveryFee="0.0000" Trans_mnyInventoryTotal="1.0000" Trans_mnyInventoryBookingFeeTotal="0.0000" Trans_mnyInventoryDeliveryFeeTotal="0.0000" Trans_mnyDiscount="0.0000" Trans_mnyTotal="7225.7200" Trans_mnyTicketsTax="0.0000" Trans_mnyTicketNett="7000.0000" Trans_strTicketsTotal="Rs.7000.00" Trans_strTicketsBookingFee="Rs.224.72" Trans_strTicketsDeliveryFee="Rs.0.00" Trans_strInventoryTotal="Rs.1.00" Trans_strInventoryBookingFeeTotal="Rs.0.00" Trans_strInventoryDeliveryFeeTotal="Rs.0.00" Trans_strDiscount="Rs.0.00" Trans_strTotal="Rs.7225.72" Trans_strTicketsTax="Rs.0.00" Trans_strTicketNett="Rs.7000.00" Trans_intTicketsQuantity="2" Booking_strCommitted="Y" Trans_strPaymentReceived="Y" Trans_strPaymentMode="Credit Card/Debit Card" Trans_strPartialCardNo="" Trans_strAlertMail="mantasea@gmail.com" Trans_strAlertMobile="7259179605" Member_lngId="0" Member_strMail="" Member_strName="Customer" Trans_strBarCodeName="CWBL00D7CB8J8U-466244159" Trans_strBarCodeText="CWBL00D7CB8J8U" Trans_strMessage1="" Trans_strMessage2="" Trans_strMessage3="" Trans_strShowBanner="N" Trans_strBannerImage="" Trans_strBannerURL="" Trans_bitSendConfirmationMail="True" Trans_bitSendConfirmationSMS="True" Trans_strTemplate="BookingConfirmation_CT" Trans_bitTPIN="False" Trans_strTPIN="" Trans_strDiscountText="" Trans_strCurrency="Rs." Trans_strPayType="" Trans_strDebtorId="" Trans_strSubDebtorId="" Trans_strKidShirtSize="" Trans_strGuardShirtSize="" Trans_strRaceCat="" Trans_HasETicket="N" Trans_mnyAdditionalCharges="0.0000" Trans_strAdditionalCharges="Rs.0.00" Trans_strData="" Trans_strETicketURL="" Member_strDetails="" Trans_xmlDetails="" Trans_strMergeTPINSMS="N" Venue_strPhoneNo="" Trans_strETicketURLEx="" Trans_strGenerateKioskBarcode="N" Trans_strTPINSMSText="" Trans_strSMSText1="" Trans_strMergeKioskBarcodeWithSMS="N" Trans_strHasInventory="Y" Trans_xmlAddressDetails="" Venue_strApplication="BT" Trans_strQRCodeText="CWBL00D7CB8J8U-ET00022121,10192,05-Jul-2014,19:07"  />
</Summaries>
<SessionOrders>
<SessionOrder Venue_strCode="CWBL" Session_lngSessionId="10192" Venue_strName="Chowdiah Memorial Hall" Venue_strLocation="Bangalore" Event_strName="Ahmad Jamal Live In Concert " Event_strShortName="Ahmad Jamal Live In Conce" Trans_dtmShowStamp="Sat, 5 Jul, 2014 @ 7:00pm" Trans_dtmShowDate="Sat, 5 Jul, 2014" Trans_dtmShowTime="7:00pm" Trans_strSeatInfo="Row AA to I:C22,C23" Trans_strSeatData="2 X Row AA to I" Cinema_strEmail="" Event_strSKUCode="" Trans_intQuantity="2" Trans_mnyTicketsTotal="7000.0000" Trans_strTicketsTotal="Rs.7000.00" Trans_strTPIN="" Booking_lngId="466244159" Event_strCode="ET00022121" Ticket_strType="T463" AreaCat_strCode="AC00000425" Venue_strLongitude="77.575509" Venue_strLatitude="13.006609" Trans_dtmUTCShowDate="2014-07-05T19:00:00+05:30" Venue_strBuilding="16th Cross" Venue_strStreet="G.D. Park Extension, 2nd Main Road, Malleswaram" Venue_strCity="Bangalore" Venue_strState="Karnataka" Venue_strCountry="India" Venue_strTelephone="39895050" Venue_strPostalCode="560003" Venue_strNameOnly="Chowdiah Memorial Hall" Screen_strName=""  />
</SessionOrders>
<Inventories>
<Inventory TransI_lngId="466244159" TransI_intSequence="1" Trans_intSequence="1" Item_lngId="382" TransI_intQuantity="1" TransI_mnySalesPrice="1.0000" TransI_mnySalesTax1="0.0000" TransI_mnySalesTax2="0.0000" TransI_mnySalesTax3="0.0000" TransI_mnySalesTax4="0.0000" TransI_mnyBookingFee="0.0000" TransI_mnyDeliveryFee="0.0000" TransI_strSalesPrice="Rs.1.00" TransI_strSalesTax1="Rs.0.00" TransI_strSalesTax2="Rs.0.00" TransI_strSalesTax3="Rs.0.00" TransI_strSalesTax4="Rs.0.00" TransI_strBookingFee="Rs.0.00" TransI_strDeliveryFee="Rs.0.00" TransI_strItemIsDeliverable="AV" Booking_strType="" TransI_strData="" TransI_dtmDateTime="30 Jun 2014 7:01 PM" TransI_xmlDetails="" Item_strShortName="Book A Smile Rs 1" Item_strDescription="Book A Smile Rs 1" Item_strTagLine="Book A Smile Rs 1" ItemGroup_lngId="109" Item_strType="DN" TransI_mnyTotal="1.0000" TransI_TransTotal="Rs.1.00" ItemVar_intSequence="1"  />
</Inventories>
<SeatInfos>
<SeatInfo Event_strTitle="Ahmad Jamal Live In Concert" Event_strShortCode="AJLC" Trans_dtmShowDate="05-Jul-2014" Trans_dtmShowTime="07:00 pm" Venue_strName="Chowdiah Memorial Hall" Venue_strCode="CWBL" Booking_strCommitted="Y" Trans_strGate="|" Trans_strBay="|" Trans_strFlight="|" Trans_strLevel="|" Trans_strStand="| |" Trans_strEntrance="| |" AreaM_strCategory="|" Trans_strSeatInfo="Row AA to I:C22,C23" Trans_intQuantity="1" Trans_mnyTicketsTotal="3500.0000" Event_strCode="ET00022121" TType_strCode="T463" Session_lngSessionId="10192"  />
</SeatInfos>
<AddChgss/>
</BMS>

I have a single SQL table containing all the attributes as columns. 我有一个包含所有属性作为列的单个SQL表。 I need to parse the data and put all the data into one single mySQL table, also the repeated attributes should be ignored. 我需要解析数据并将所有数据放入一个单独的mySQL表中,而且重复属性也应被忽略。 The XML format cannot be changed. XML格式不能更改。 I have wriiten a node.js app ad using xml2j I can parse the string but I don't know how to go ahead. 我使用xml2j编写了一个node.js应用广告,我可以解析该字符串,但是我不知道如何继续。

Here is my node.js code, 这是我的node.js代码,

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var qs = require('querystring');
var redis = require('redis').createClient();
var parseString = require('xml2js').parseString;
var count = 0;

app.get('/adminm', function (req, res) {
    res.sendfile('adminmovies.html');
});

app.get('/admine', function (req, res) {
    res.sendfile('adminevents.html');
});

app.post('/', function (req, res) {
    count = count + 1;
    var body = "";
    req.on('data', function (data) {
        body += data;
    });
    req.on('end', function () {
        //console.log(body);
        var xml = body;
        var parsed = "";
        parseString(xml, function (err, result) {
            console.log(JSON.stringify(result));
            redis.lpush("events", JSON.stringify(result));

        });

        io.emit('count1', count);
    });
});
http.listen(3000, function () {
    console.log('listening on *:3000');
});

Now I need the data in this format, 现在我需要这种格式的数据,

{name: 'XYZ', age: '21', ....}

How do I proceed? 我该如何进行?

I think part of the problem is that the XML you have is using attributes for everything. 我认为部分问题是您拥有的XML对所有内容都使用属性。 It might be somewhat easier if it used elements. 如果使用元素,可能会更容易一些。 Take a look at my https://github.com/imbroglioj/xml-to-es which allows you to specify in a property file how you want your resultant JSON object massaged by promoting child elements or attributes to top-level, etc. It would be easy to extend the property file and the collapsing function to erase fields or rename them. 看看我的https://github.com/imbroglioj/xml-to-es ,它允许您在属性文件中指定如何通过将子元素或属性提升为顶层等方式对生成的JSON对象进行按摩。扩展属性文件和折叠功能以擦除字段或重命名字段将很容易。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM