2013年9月11日 星期三

載入XML,讀入XML中所有節點資料


[-- 範例XML start --]
<?xml version="1.0" encoding="UTF-8" ?>
<TKROOTMAIN>
    <TKTSUBDCONT>
        <TKRECDSET>
            <TKSQID published="1">2294-00001</TKSQID>
            <TKUSENOTE>
                <TKUSELIMIT>
                    <item>
                        <LMTSQ>1</LMTSQ>
                        <LMTTEXT>
                            <![CDATA[※根據各國的入境新規定,所有前往中國大陸/日本/韓國/美加/紐澳線之旅客必須於訂位時,提供旅客相關証件資料,內容包括:姓名、國籍、性別、出生日期、護照或台胞證號碼、有效期限、當地之詳細地址及居住國等相關資料,請務必於訂購時將相關之資料填寫於訂單之備註欄中。以免影響旅客登機作業** ※淡旺季日期票價之適用出發日區分:1.美加線:以日本出發航段計算。2.其它航線:以台灣出發航段計算。而機票之效期計算方式仍以台灣出發日為計算基準。]]>
                        </LMTTEXT>
                    </item>
                    <item>
                        <LMTSQ>2</LMTSQ>
                        <LMTTEXT>
                            <![CDATA[※全程未使用退票手續費(退票時間約需2個月以上),收費標準如下:航空公司退票手續費或罰金TWD1500+東南旅行社作業服務費:售價的8%。部分使用之退票費用,請洽詢您的業務承辦人員。 ※機票一經使用不可退票。 ※ 退票辦法依各航空公司各路線之規定辦理(限於機票效期內申請),本公司會酌收手續費。]]>
                        </LMTTEXT>
                    </item>
                    <item>
                        <LMTSQ>3</LMTSQ>
                        <LMTTEXT>
                            <![CDATA[※機票一經開立後不可更改行程。 ※【歐洲線】更改日期航班規則:1.S艙:【機票未使用前】去程:不可更改;回程:可。【出發後】回程:每次需收罰金TWD 1000+手續費。2.L艙:【機票未使用前】去/回程不可更改。【出發後】回程:每次需收罰金TWD 1000+手續費。若更改導致票價不同時須支付差額。 ※機票所有更改訂位等事宜須於每次更改訂位後24小時內且須於原訂位之航班出發前立即完成改票付費(不可NO SHOW)!否則該機票視為無效機票!(如遇假日須提前作業)。 ※如因更改日期/航班/行程導致無法連結而必須重新作業或更改機票重新開立時,除了航空公司得收取改票手續費外,本公司亦需另外收取改票服務費TWD600
                            (如有稅金票價差額亦需補收)。]]>
                        </LMTTEXT>
                    </item>
                </TKUSELIMIT>
            </TKUSENOTE>
            <TICKETPRICE>
                <item>
                    <PRICETYPE>B2C</PRICETYPE>
                    <PRICELEVL>
                        <item>
                            <LEVELTYPE>ADT</LEVELTYPE>
                            <TKPRICE>29425.000</TKPRICE>
                            <DISCTKPRICE>29130.750</DISCTKPRICE>
                            <INCLDPRICE>0</INCLDPRICE>
                            <BSP>0</BSP>
                        </item>
                        <item>
                            <LEVELTYPE>CHILDS</LEVELTYPE>
                            <TKPRICE>0.000</TKPRICE>
                            <DISCTKPRICE>0.000</DISCTKPRICE>
                            <INCLDPRICE>0</INCLDPRICE>
                            <BSP>0</BSP>
                        </item>
                        <item>
                            <LEVELTYPE>INF</LEVELTYPE>
                            <TKPRICE>0.000</TKPRICE>
                            <DISCTKPRICE>0.000</DISCTKPRICE>
                            <INCLDPRICE>0</INCLDPRICE>
                            <BSP>0</BSP>
                        </item>
                    </PRICELEVL>
                </item>
            </TICKETPRICE>
            <TICKETOTHERFARE>
                <STOPADDPRICE faretypetp="2" moststoppoint="0" stopcondi="1">
                    <item>
                        <SEGNO>1</SEGNO>
                        <ROUTEDESC>TPE/NRT</ROUTEDESC>
                        <ADDUSEDTAREA>20130420/20130930</ADDUSEDTAREA>
                        <LIMITWEEKEND>1,1,1,1,1,1,1</LIMITWEEKEND>
                        <FARETYPESUB/>
                        <ADTFARETYPEM>2000.000</ADTFARETYPEM>
                        <CHDFARETYPEM>2000.000</CHDFARETYPEM>
                        <INFFARETYPEM>2000.000</INFFARETYPEM>
                    </item>
                    <item>
                        <SEGNO>3</SEGNO>
                        <ROUTEDESC>MUC/NRT</ROUTEDESC>
                        <ADDUSEDTAREA>20130420/20130930</ADDUSEDTAREA>
                        <LIMITWEEKEND>1,1,1,1,1,1,1</LIMITWEEKEND>
                        <FARETYPESUB/>
                        <ADTFARETYPEM>2000.000</ADTFARETYPEM>
                        <CHDFARETYPEM>2000.000</CHDFARETYPEM>
                        <INFFARETYPEM>2000.000</INFFARETYPEM>
                    </item>
                </STOPADDPRICE>
            </TICKETOTHERFARE>
        </TKRECDSET>
    </TKTSUBDCONT>
</TKROOTMAIN>
[-- 範例XML end --]



[-- 載入XML,讀入XML中所有節點資料 start --]
        XDocument xdoc = default(XDocument);
       
        //載入XML檔案
        try
        {
            xdoc = XDocument.Load(Xmlfile);
        }
        catch (XmlException ex)
        {
            //刪除XML格式錯誤的檔案
            FileInfo fi = new FileInfo(Xmlfile);
            fi.Delete();
        }


        //Linq for XML,讀入XML中所有節點資料
        var xNodeList = from nl in xdoc.Descendants("TKRECDSET")
                        select new
                        {
                            TSUBD_CD = nl.Element("TKSQID").Value,
                            TSUBD_LMT_DR = nl.Element("TKUSENOTE").Element("TKUSELIMIT"),
                            TICKETPRICEB2C = (from TICKETPRICE in nl.Elements("TICKETPRICE").Elements("item")
                                              where TICKETPRICE.Element("PRICETYPE").Value == "B2C"
                                              select TICKETPRICE).ToList(),
                            STOPADDPRICE = nl.Descendants("TICKETOTHERFARE").Elements("STOPADDPRICE").Elements("item").ToList()
                        };

        //解析節點下的所有資訊
        foreach (var TicketItem in xNodeList)
        {
            string TSUBD_CD = TicketItem.TSUBD_CD;
            //該節點資料為多筆,再次解析所有資訊
            foreach (var tf in TicketItem.STOPADDPRICE)
            {
                FARE_WK_DY = tf.Element("LIMITWEEKEND").Value;
            }
        }
[-- 載入XML,讀入XML中所有節點資料 end --]

************************************************************************************************************

[-- 遠端回傳的範例XML start --]
<?xml version="1.0" ?>
<Result>
<oSQL>select G.ACCT_NO as SACCT_NO, G.GRUP_CD, G.GRUP_NM,isNull(G.GRUP_SNM,'') as GRUP_SNM , isNull(G.ITN_CITY,'') as ITN_CITY, G.MGRUP_CD , G.ORDER_DL, G.GRUP_LN, isNull(G.GRUP_RK,'') as GRUP_RK, isNull(G.HOT_TP,'') as HOT_TP , isNull((select AGT_AM from TRGPRICE where ACCT_NO = G.ACCT_NO and GRUP_CD=G.GRUP_CD and BED_TP = '1' AND AMRNK='1' AND JOIN_TP='1'),0) as AGT_AM , 'CURR_AM'=case when P.CURR_AM&gt;X.CURR_AM then P.CURR_AM ELSE X.CURR_AM end , G.LEAV_DT , G.B2B2C_FG, isNull(G.ESTM_YQT,0) as ESTM_YQT, isNull(G.DONE_YQT, 0) as DONE_YQT, isNull(G.SALE_YQT,0) as SALE_YQT , (P.CURR_AM-isNull((select AGT_AM from TRGPRICE where ACCT_NO = G.ACCT_NO and GRUP_CD=G.GRUP_CD and BED_TP = '1' and AGT_AM &lt;=P.CURR_AM and AMRNK='1' and JOIN_TP='1'),0)) as bonus, isNull((SELECT SUM(ATT_AM) FROM TRGOPITEM O WHERE O.ACCT_NO = G.ACCT_NO AND O.GRUP_CD = G.GRUP_CD AND isNull(VISA_CD,'') = ''),0) AS OTHER_AM  from TRGRUPIDX as G  inner Join TRGRUPREF as P on P.SACCT_NO = G.ACCT_NO and P.GRUP_CD=G.GRUP_CD and P.BED_TP = '1'  and P.ACCT_NO = '04436435'  left outer join TRGPRICE X on G.GRUP_CD = X.GRUP_CD  and X.BED_TP='1' and X.ACCT_NO =G.ACCT_NO and X.JOIN_TP='1' where G.GRUP_CD in (select distinct GRUP_CD from TRGRUPREF where ACCT_NO = '04436435')  and G.ORDER_DL&gt;'2013/09/10'  and isNull(G.DEL_FG,0) = 0  and not (P.CURR_AM = 0 and X.CURR_AM =0 )  and ITN_NATN&lt;&gt;'TW' and isNull((select AGT_AM from TRGPRICE where ACCT_NO = G.ACCT_NO and ACCT_NO &lt;&gt; '04436435' and GRUP_CD=G.GRUP_CD and BED_TP = '1' AND AMRNK='1' AND JOIN_TP='1'),9999) &gt; 0 and P.JOIN_TP = '1'  and P.AMRNK &lt;&gt; 0  order by LEAV_DT</oSQL>
<oRecCnt>918</oRecCnt>
<oPgCnt>918</oPgCnt>
<oErrMsg></oErrMsg>
<oXml>
<grup_list no="1">
<sacct_no>04436435</sacct_no>
<grup_cd>PST05130912A</grup_cd>
<grup_nm>泰航假期~愛上華欣五日</grup_nm>
<grup_snm>泰航假期~愛上華欣五日</grup_snm>
<mgrup_cd>PST05</mgrup_cd>
<itn_city>BKK/HHQ</itn_city>
<order_dl>2013/09/12</order_dl>
<grup_ln>5</grup_ln>
<grup_rk>&amp;lt;DIV style=&amp;quot;FONT-FAMILY: 新細明體; LETTER-SPACING: 1pt; FONT-SIZE: 10pt; top-margin: 0pt; left-margin: 0pt&amp;quot;&amp;gt;&amp;lt;P style=&amp;quot;LINE-HEIGHT: 12pt; MARGIN: 0cm 0cm 0pt; FONT-FAMILY: 新細明體; LETTER-SPACING: 1pt; FONT-SIZE: 10pt; top-margin: 0pt; left-margin: 0pt; mso-line-height-rule: exactly&amp;quot; class=MsoNormal&amp;gt;&amp;lt;SPAN style=&amp;quot;FONT-FAMILY: 標楷體; COLOR: black; mso-hansi-font-family:</grup_rk>
<hot_tp></hot_tp>
<agt_am>34000</agt_am>
<curr_am>37000</curr_am>
<leav_dt>2013/09/12</leav_dt>
<b2b2c_fg>False</b2b2c_fg>
<estm_yqt>10</estm_yqt>
<done_yqt>0</done_yqt>
<sale_yqt>10</sale_yqt>
<bonus>3000</bonus>
<other_am>18000</other_am>
</grup_list>
</oXml>
<InputData>
<iACCT_NO>04436435</iACCT_NO>
<iMGRUP_CD></iMGRUP_CD>
<iSACCT_NO>04436435,</iSACCT_NO>
<iNATN></iNATN>
<iCITY></iCITY>
<iBDT></iBDT>
<iEDT></iEDT>
<iDayLN1></iDayLN1>
<iDayLN2></iDayLN2>
<iAIR_PT></iAIR_PT>
<iAMB></iAMB>
<iAME></iAME>
</InputData>
</Result>
[-- 遠端回傳的範例XML end --]



[-- 載入遠端的XML,讀入XML中所有節點資料 start --]
            Response.BufferOutput = false;
            Response.Clear();

            //取得遠端的團體行程XML
            string url = "http://www.ftstour.com.tw/eWeb/GODC/L_GO_list2.asp?pagesize=1&page=1";
            WebClient myWebClient = new WebClient();
            myWebClient.Proxy = null;    //.NET中的默認代理是開啟的,使用默認代理時,只有等待超時後才會繞過代理,從而導致第一次連接特別慢
            byte[] myDataBuffer = myWebClient.DownloadData(url);
            string strWebData = Encoding.Default.GetString(myDataBuffer);
            Stream sm = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(strWebData.Trim()));
            XmlReader xmlread = XmlReader.Create(sm);
            doc = XDocument.Load(xmlread);

            //取得團體行程總筆數
            int totalRecord = Convert.ToInt32(doc.Root.Element("oRecCnt").Value);

            //逐筆取得所有行程詳細內容
            for (int i = 0; i < totalRecord; i++)
            {
                url = "http://www.ftstour.com.tw/eWeb/GODC/L_GO_list2.asp?pagesize=1&page=" + (i + 1).ToString();
                myDataBuffer = myWebClient.DownloadData(url);
                strWebData = Encoding.Default.GetString(myDataBuffer);
                sm = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(strWebData.Trim()));
                xmlread = XmlReader.Create(sm);
                doc = XDocument.Load(xmlread);


                childList = from el in doc.Root.Elements("oXml").Descendants("grup_list")
                            select el;

                s = "";
                string strGroup = "";
                foreach (XNode el in childList.DescendantNodes())
                {
                    //判斷節點型別,轉型為XElement
                    if (el.NodeType == XmlNodeType.Element)
                    {
                        XElement xl = ((System.Xml.Linq.XElement)(el));
                        if (!string.IsNullOrEmpty(xl.Value))
                        {
                            strGroup += s + xl.Name + "=" + xl.Value;
                            s = "<br>";
                        }
                    }
                }

                Response.Write("<hr>" + strGroup);
                Response.Flush();
            }
[-- 載入遠端的XML,讀入XML中所有節點資料 end --]

沒有留言:

張貼留言