Like Share Discussion Bookmark Smile

J.J. Huang   2023-02-05   天堂私服 10.XML分析/教學   瀏覽次數:次   DMCA.com Protection Status

天堂私服 | Java DOM 基礎

章節用意

核心中有使用Java DOM解析器對XML進行解組並使用,在進行更進一步的分析時,需要先了解Java DOM的解析器基礎使用。
此章節將會介紹如何使用Java DOMXML進行解組(unmarshal)。

核心版本

  • L1J-3.80c

分析

  • 於核心中可以找到/data/xml/GmCommands/GMCommands.xml,其用途為設定Boss的循環重生設定。
  • 在進一步搜尋可以找到src/l1j/server/server/GMCommandsConfig.java是解組該xml的主要程式。
  • 可見下圖,左方import所使用的即是javax.xmlorg.w3c.dom,右方為使用的xml

Java DOM 解析器 - 概述

文件物件模型是全球資訊網聯盟(W3C)的官方推薦。它定義了一個介面,使程式能夠存取和更新樣式,結構和XML文件的內容。支援DOM實現該介面的XML解析器。

  • 何時使用?
    • 在以下幾種情況時,應該使用DOM解析器:
      • 需要知道很多關於文件的結構。
      • 需要將文件的部分周圍(例如,可能需要某些元素進行排序)。
      • 需要使用的檔案中的資訊超過一次
  • 會得到什麼?
    • 當使用DOM解析器解析一個XML文件,會得到一個樹形結構,其中包含的所有文件的元素。DOM提供了多種可用於檢查文件的內容和結構的函式。
  • 優勢
    • DOM是用於處理文件結構的通用介面。它的一個設計目標是Java程式碼編寫一個DOM相容的解析器,執行在任何其他的DOM相容的解析器不會有變化。
  • DOM介面
    • DOM定義了幾個Java介面。這裡是最常見的介面:
      • 節點 - DOM的基本資料型別。
      • 元素 - 要處理的物件絕大多數是元素。
      • Attr - 代表元素的屬性。
      • 文字 - 元素或Attr的實際內容。
      • 文件 - 代表整個XML文件。文件物件是通常被稱為DOM樹。
  • 常見的DOM方法
    • 當正在使用DOM,有經常用到的幾種方法:
      • Document.getDocumentElement() - 返回文件的根元素。
      • Node.getFirstChild() - 返回給定節點的第一個子節點。
      • Node.getLastChild() - 返回給定節點的最後一個子節點。
      • Node.getNextSibling() - 這些方法返回一個特定節點的下一個兄弟節點。
      • Node.getPreviousSibling() - 這些方法返回一個特定節點的前一個兄弟節點。
      • Node.getAttribute(attrName) - 對於給定的節點,則返回所請求的名字的屬性。

Java DOM 範例(解組)

此處使用核心內的GMCommands.xml來當作範例。

  • 先觀看XML的結構。
    • GMCommands.xml

      註:範例內容有部分刪減,並非原本的完整內容。

  • 所以根據XML的元素與屬性,分別定義出兩個Object -
    • L1ItemSetItem
    • Room
  • 接著使用DOM來將XML解組至Java對象內,並將內容輸出。
    • Main
    • Console
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      Name:ot,        LocX:32715, LocY:32448, MapId:4
      Name:it, LocX:32771, LocY:32822, MapId:75
      Name:dicarding, LocX:32766, LocY:32797, MapId:77
      Name:gludio, LocX:32612, LocY:32734, MapId:4
      Name:hv, LocX:32671, LocY:32836, MapId:69
      Name:mt, LocX:33054, LocY:32323, MapId:4
      Name:kent, LocX:33050, LocY:32780, MapId:4
      Name:werldern, LocX:33705, LocY:32504, MapId:4
      Name:aden, LocX:33966, LocY:33253, MapId:4
      Name:sc, LocX:32854, LocY:32907, MapId:304
      Name:skt, LocX:33080, LocY:33392, MapId:4
      Name:ti, LocX:32580, LocY:32931, MapId:0
      Name:si, LocX:32782, LocY:32756, MapId:68
      Name:gmshop, LocX:33079, LocY:33402, MapId:4
      Name:ww, LocX:32621, LocY:33169, MapId:4
      Name:gunter, LocX:32669, LocY:32790, MapId:3
      Name:oren, LocX:34061, LocY:32276, MapId:4
      Name:bluedika, LocX:32739, LocY:32801, MapId:305
      Name:heine, LocX:33612, LocY:33268, MapId:4
      Name:giran, LocX:33442, LocY:32797, MapId:4
      Name:gypsy, LocX:33978, LocY:32927, MapId:4

      Name:dkset
      Id:58, Amount:1, Enchant:10
      Id:20010, Amount:1, Enchant:10
      Id:20100, Amount:1, Enchant:10
      Id:20166, Amount:1, Enchant:10
      Id:20198, Amount:1, Enchant:10

結語

為什麼用XML?好處是什麼?可以參考XML 基礎教學

原創文章真的不易,希望多多支持,感謝。
最後建議回顧一下首章天堂私服 | 天堂私服架設教學,了解其章節目錄。

免責聲明

  • 本部落格文章中皆不提供任何所謂的遊戲「主程式」、「模擬器」、「登入器」…等等相關程式的下載點。
  • 本部落格文章中所見之遊戲主程式和服務器端程序均來自網路發佈,版本歸原作者所有
  • 本部落格文章為研究SQL資料庫與修改JAVA語法使用,非商業用途,亦無做營運事實等任何一切商業行為
  • 本部落格文章內容是為研究學習設計思想和原理為目的,絕沒有故意侵權或惡意抄襲、篡改其他遊戲內容

註:以上參考了
tutorialspoint - Java DOM Parser - Overview