Dom4j解析xml復雜多節點報文

XML是一種通用的數據交換格式,它的平臺無關性、語言無關性、系統無關性、給數據集成與交互帶來了極大的方便。XML在不同的語言環境中解析方式都是一樣的,只不過實現的語法不同而已。

XML的解析方式分為四種:

? ? 1、DOM解析;

? ? 2、SAX解析;

? ? 3、JDOM解析;

? ? 4、DOM4J解析。

其中前兩種屬于基礎方法,是官方提供的平臺無關的解析方式;后兩種屬于擴展方法,它們是在基礎的方法上擴展出來的,只適用于java平臺。

本文介紹的是DOM4J方式解析。依賴jar包:

<dependency>

<groupId>dom4j</groupId>

<artifactId>dom4j</artifactId>

<version>1.6.1</version>

</dependency>

xml報文如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Root>

? ? <SttlCntNb>2</SttlCntNb>

? ? <DebitCntAmt>CNY0.00</DebitCntAmt>

? ? <CreditCntAmt>CNY4700.00</CreditCntAmt>

? ? <SttlList>

? ? ? ? <SttlInf>

? ? ? ? ? ? <SttlReptFlg>2018052500170139</SttlReptFlg>

? ? ? ? ? ? <SttlDCFlg>2</SttlDCFlg>

? ? ? ? ? ? <SttlAmt>CNY100.00</SttlAmt>

? ? ? ? ? ? <BatchList>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805230015</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY100.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0113|C3228644000018|04|CNY0.00|0|CNY5.00|1|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0120|C3228640000020|05|CNY50.00|1|CNY0.00|0|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0114|C3228640000029|07|CNY0.00|0|CNY5.00|1|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0115|C3228640000019|06|CNY0.00|0|CNY5.00|1|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0111|C3228640000016|03|CNY0.00|0|CNY10.00|1|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0110|C3228644000016|01|CNY0.00|0|CNY110.00|1|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0112|C3228644000017|99|CNY0.00|0|CNY5.00|1|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0110|C3228644000016|02|CNY0.00|0|CNY10.00|1|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? </BatchList>

? ? ? ? </SttlInf>

? ? ? ? <SttlInf>

? ? ? ? ? ? <SttlReptFlg>2018052500170138</SttlReptFlg>

? ? ? ? ? ? <SttlDCFlg>2</SttlDCFlg>

? ? ? ? ? ? <SttlAmt>CNY4600.00</SttlAmt>

? ? ? ? ? ? <BatchList>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240001</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY400.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0126|C1010511003703|00|CNY0.00|4|CNY0.00|0|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0125|C1010211000012|01|CNY0.00|8|CNY0.00|0|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0126|C1010211000012|01|CNY0.00|8|CNY0.00|0|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0124|C1010211000012|01|CNY0.00|8|CNY0.00|0|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0123|C1010211000012|01|CNY0.00|4|CNY0.00|0|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0110|C1010211000012|01|CNY0.00|0|CNY400.00|2|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240002</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY400.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0125|C1010211000012|00|CNY400.00|4|CNY0.00|0|</SubItemInf>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0110|C1010211000012|00|CNY0.00|0|CNY800.00|2|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240003</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>1</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY0.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0120|C1010211000012|00|CNY0.00|4|CNY0.00|0|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240004</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY1200.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0112|C1010211000012|01|CNY0.00|0|CNY1200.00|2|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240005</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY400.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0113|C1010211000012|00|CNY0.00|0|CNY400.00|4|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240006</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY400.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0114|C1010211000012|00|CNY0.00|0|CNY400.00|4|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240007</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY200.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0115|C1010211000012|01|CNY0.00|0|CNY200.00|2|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240008</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY600.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0115|C1010211000012|01|CNY0.00|0|CNY600.00|2|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240009</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY400.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0110|C1010511003703|00|CNY0.00|0|CNY400.00|2|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240010</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>2</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY1200.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0111|C1010211000012|01|CNY0.00|0|CNY1200.00|4|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? ? ? <BatchInf>

? ? ? ? ? ? ? ? ? ? <BatchId>B201805240012</BatchId>

? ? ? ? ? ? ? ? ? ? <BatchDCFlg>1</BatchDCFlg>

? ? ? ? ? ? ? ? ? ? <BatchNetAmt>CNY1200.00</BatchNetAmt>

? ? ? ? ? ? ? ? ? ? <SubItemList>

? ? ? ? ? ? ? ? ? ? ? ? <SubItemInf>0116|C1010511003703|00|CNY1200.00|4|CNY0.00|0|</SubItemInf>

? ? ? ? ? ? ? ? ? ? </SubItemList>

? ? ? ? ? ? ? ? </BatchInf>

? ? ? ? ? ? </BatchList>

? ? ? ? </SttlInf>

? ? </SttlList>

</Root>

主要核心代碼如下:

String saveFile 為本地保存xml報文的路徑。

AccountInfoEntityResp? 為解析xml后封裝的obj實體對象。

/**

? ? * 解析xml文件并

? ? */

? ? public String Dom4jGetXML(String saveFile){

? ? ? ? //返回的Entity對象

? ? ? ? String xmlContents = new String();

? ? ? ? // 創建SAXReader的對象reader

? ? ? ? SAXReader reader = new SAXReader();

? ? ? ? try {

//? ? ? ? ? ? Resource resource = new ClassPathResource("accountInfo/"+accountDate+".xml");

? ? ? ? ? ? Resource resource = new ClassPathResource(saveFile);

? ? ? ? ? ? File file = null;

? ? ? ? ? ? try{

? ? ? ? ? ? ? ? file = resource.getFile();

? ? ? ? ? ? }catch (Exception e){

? ? ? ? ? ? ? ? //拋出異常

? ? ? ? ? ? }

? ? ? ? ? ? // 通過reader對象的read方法加載books.xml文件,獲取docuemnt對象。

? ? ? ? ? ? Document document = reader.read(file);

? ? ? ? ? ? // 通過document對象獲取根節點bookstore

? ? ? ? ? ? Element rootElement = document.getRootElement();

? ? ? ? ? ? //document轉換為String字符串

? ? ? ? ? ? xmlContents? = document.asXML();

? ? ? ? ? ? //解析xml文件并轉換為obj

? ? ? ? } catch (DocumentException e) {

? ? ? ? ? ? // TODO Auto-generated catch block

? ? ? ? ? ? e.printStackTrace();

? ? ? ? }

? ? ? ? return xmlContents;

? ? }

/**

? ? * 解析對賬文件xml,轉換為obj對象返回前段

? ? * @Descriptions: 循環遍歷所有子節點,保存每個節點的值

? ? * @Return: AccountInfoEntity

? ? */

? ? public AccountInfoEntityResp getNodes(Element node){

? ? ? ? AccountInfoEntityResp accountInfoEntityResp = new AccountInfoEntityResp();

? ? ? ? List<SttlInf> SttlList = new ArrayList<SttlInf>();

? ? ? ? //獲得指定節點下面的子節點,首先要知道自己要操作的節點。

? ? ? ? Element SttlCntNbElem = node.element("SttlCntNb");

? ? ? ? //獲取SttlCntNb

? ? ? ? String SttlCntNb = SttlCntNbElem.getTextTrim();

? ? ? ? //獲取DebitCntAmt

? ? ? ? Element DebitCntAmtElem = node.element("DebitCntAmt");

? ? ? ? String DebitCntAmt = DebitCntAmtElem.getTextTrim();

? ? ? ? //獲取CreditCntAmt

? ? ? ? Element CreditCntAmtElem = node.element("CreditCntAmt");

? ? ? ? String CreditCntAmt = CreditCntAmtElem.getTextTrim();

? ? ? ? accountInfoEntityResp.setSttlCntNb(Integer.valueOf(SttlCntNb));

? ? ? ? BigDecimal CreditCntAmtVal = null;

? ? ? ? if(CreditCntAmt != null && !CreditCntAmt.isEmpty()){

? ? ? ? ? ? CreditCntAmtVal = new BigDecimal(CreditCntAmt.replace("CNY", ""));

? ? ? ? }

? ? ? ? accountInfoEntityResp.setCreditCntAmt(CreditCntAmtVal);

? ? ? ? BigDecimal DebitCntAmtval = null;

? ? ? ? if(DebitCntAmt != null && !DebitCntAmt.isEmpty()){

? ? ? ? ? ? DebitCntAmtval = new BigDecimal(DebitCntAmt.replace("CNY", ""));

? ? ? ? }

? ? ? ? accountInfoEntityResp.setDebitCntAmt(DebitCntAmtval);

? ? ? ? //獲取SttlList

? ? ? ? Element SttlListEle = node.element("SttlList");

? ? ? ? //獲取SttlInf

? ? ? ? Element SttlInfEle = SttlListEle.element("SttlInf");

? ? ? ? List<Element> SttlInfList = SttlListEle.elements();

? ? ? ? //遍歷SttlInfList節點

? ? ? ? String SttlReptFlg? = "";

? ? ? ? Integer SttlDCFlg = null;

? ? ? ? BigDecimal SttlAmt = null;

? ? ? ? for(Element e : SttlInfList){

? ? ? ? ? ? List<BatchInf> BatchList = new ArrayList<BatchInf>();

? ? ? ? ? ? SttlInf sttlInf = new SttlInf();

? ? ? ? ? ? //SttlInf下的子節點

? ? ? ? ? ? Element SttlReptFlgEle = e.element("SttlReptFlg");

? ? ? ? ? ? SttlReptFlg = SttlReptFlgEle.getTextTrim();

? ? ? ? ? ? Element SttlDCFlgEle = e.element("SttlDCFlg");

? ? ? ? ? ? SttlDCFlg = Integer.valueOf(SttlDCFlgEle.getTextTrim());

? ? ? ? ? ? Element SttlAmtEle = e.element("SttlAmt");

? ? ? ? ? ? SttlAmt = new BigDecimal(SttlAmtEle.getTextTrim().replace("CNY", ""));

? ? ? ? ? ? //設值

? ? ? ? ? ? sttlInf.setSttlAmt(SttlAmt);

? ? ? ? ? ? sttlInf.setSttlDCFlg(SttlDCFlg);

? ? ? ? ? ? sttlInf.setSttlReptFlg(SttlReptFlg);

? ? ? ? ? ? //獲取BatchList節點

? ? ? ? ? ? Element BatchListEle = e.element("BatchList");

? ? ? ? ? ? //獲取BatchInf

? ? ? ? ? ? List<Element> BatchInfList = BatchListEle.elements();

? ? ? ? ? ? for(Element e2 : BatchInfList){

? ? ? ? ? ? ? ? List<SubItemInf> SubItemList = new ArrayList<SubItemInf>();

? ? ? ? ? ? ? ? BatchInf batchInf = new BatchInf();

? ? ? ? ? ? ? ? String BatchId = "";

? ? ? ? ? ? ? ? Integer BatchDCFlg = null;

? ? ? ? ? ? ? ? BigDecimal BatchNetAmt = null;

? ? ? ? ? ? ? ? Element BatchIdEle = e2.element("BatchId");

? ? ? ? ? ? ? ? BatchId = BatchIdEle.getTextTrim();

? ? ? ? ? ? ? ? Element BatchDCFlgEle = e2.element("BatchDCFlg");

? ? ? ? ? ? ? ? BatchDCFlg = Integer.valueOf(BatchDCFlgEle.getTextTrim());

? ? ? ? ? ? ? ? Element BatchNetAmtEle = e2.element("BatchNetAmt");

? ? ? ? ? ? ? ? BatchNetAmt = new BigDecimal(BatchNetAmtEle.getTextTrim().replace("CNY", ""));

? ? ? ? ? ? ? ? batchInf.setBatchDCFlg(BatchDCFlg);

? ? ? ? ? ? ? ? batchInf.setBatchId(BatchId);

? ? ? ? ? ? ? ? batchInf.setBatchNetAmt(BatchNetAmt);

? ? ? ? ? ? ? ? //獲取SubItemList節點

? ? ? ? ? ? ? ? Element SubItemListEle = e2.element("SubItemList");

? ? ? ? ? ? ? ? //獲取BatchInf

? ? ? ? ? ? ? ? List<Element> SubItemInfList = SubItemListEle.elements();

? ? ? ? ? ? ? ? for(Element e3 : SubItemInfList){

? ? ? ? ? ? ? ? ? ? SubItemInf subItemInf = new SubItemInf();

? ? ? ? ? ? ? ? ? ? String subItem = "";

? ? ? ? ? ? ? ? ? ? subItem = e3.getTextTrim().replace("CNY", "");

? ? ? ? ? ? ? ? ? ? subItemInf.setSubItemInf(subItem);

? ? ? ? ? ? ? ? ? ? SubItemList.add(subItemInf);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? batchInf.setSubItemList(SubItemList);

? ? ? ? ? ? ? ? BatchList.add(batchInf);

? ? ? ? ? ? }

? ? ? ? ? ? sttlInf.setBatchList(BatchList);

? ? ? ? ? ? SttlList.add(sttlInf);

? ? ? ? }

? ? ? ? accountInfoEntityResp.setSttlList(SttlList);

? ? ? ? return accountInfoEntityResp;

? ? }

以上:有疑問或建議歡迎指出更正。感謝分享!


關注個人技術公眾號:nick_coding1024

不定期分享最新前沿技術框架和bat大廠常用技術等,加群不定期分享行業內大牛直播講課以及獲得內退一線互聯網公司機會。

---------------------CSDN技術博客

原文:https://blog.csdn.net/xuri24/article/details/83113340

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容