2013-05-10 89 views
3

我正在編程一個簡單的Java遊戲,我想將玩家數據保存到XML編碼保存文件。目前我正在發現Java XML DOM API,並且有一個簡短的問題。Java XML:獲取嵌套元素

假設我有以下XML文件(沒有意義的,我知道,但它只是一個例子)

<?xml version="1.0"?> 
<savedGame> 
    <name></name> 
    <player> 
     <name>YOU</name> 
     <map> 
         <health>2000</health> 
      <name>map_test.map</name> 
      <position> 
       <x>0</x> 
       <y>0</y> 
      </position> 
     </map> 
     <stats> 
      <health>1000</health> 
      <xp> 
       <melee></melee> 
       <magic></magic> 
       <ranged></ranged> 
       <agility></agility> 
      </xp> 
     </stats> 
     <items> 
      <item id="0"> 
       <amount></amount> 
      </item> 
     </items> 
    </player> 
</savedGame> 

現在我想要得到的球員健康水平(注意,是其他健康元素在地圖部分)。這可以用下面的代碼完成:

String hp = ((Element) ((Element) savedGameDocument.getElementsByTagName("player").item(0)).getElementsByTagName("stats").item(0)).getElementsByTagName("health").item(0).getTextContent() 

它的作品,是的。但是對我來說這看起來很骯髒。這是獲取這些嵌套元素的常用方法嗎?爲什麼沒有ElementList類?現在我必須投擲每個節點。

在此先感謝, Jori。

+1

訪問數據看看JAXB。它允許您使用yourjava對象模型,並接管序列化爲XML。 – nakosspy 2013-05-10 10:24:54

+0

非常感謝,我會看看它。但是,如果這是用普通的Java XML API來完成的最好方法,那我也很高興。 – Jori 2013-05-10 10:30:42

+0

JAXB(JSR-222)是包含在JDK/JRE中的普通Java XML API的一部分(參見'javax.xml.bind'包)。 – 2013-05-10 11:09:21

回答

1

如果你做了很多,你可以讓simple serializer來處理這個。您編寫對象並讀取對象(如播放器等),序列化器負責處理XML部分。而你專注於遊戲開發。

從手動解析DOM中的XML開始,您已經使用的邏輯不能再縮小了。這是因爲,DOM提供了非常非常基本的導航方法:列出子節點並選擇其中一個,重複直到到達所需的節點。這對輕量級XML可能有好處,但是當你解析具有許多標籤級別的錯綜複雜的結構時,很快就會變成一場噩夢。

另一種更快的方法是streaming,但是更復雜的XML結構也是如此,解析器代碼也是如此。

XPATH也很好,如果你只需要查詢XML只是一個特定的節點。但是,如果您需要完整的xml到對象轉換,請使用序列化程序。

+0

這看起來很有趣,特別是在處理大量保存遊戲數據時,這可能非常有用。但也請回到我原來的問題。 :-) – Jori 2013-05-10 10:37:34

+0

您可以使用JDK/JRE中的'javax.xml.xpath' API來通過DOM輕鬆訪問數據:http://stackoverflow.com/a/16480432/383861 – 2013-05-10 11:05:48

+0

最後兩個問題:哪裏可以我發現提供的文檔中使用了註釋(http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize)? 二進制序列化與XML序列化,什麼時候應該使用什麼? 在此先感謝! – Jori 2013-05-10 17:28:31

3

您可以使用包含在JDK/JRE中的javax.xml.xpath API輕鬆從do文檔獲取數據。

import javax.xml.xpath.*; 
import org.xml.sax.InputSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 

     InputSource xml = new InputSource("src/forum16479976/input.xml"); 
     String health = (String) xpath.evaluate("/savedGame/player/stats/health", xml, XPathConstants.STRING); 
     System.out.println(health); 
    } 

} 

這些API的工作也從一個DOM

import javax.xml.parsers.*; 
import javax.xml.xpath.*; 
import org.w3c.dom.Document; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document xml = db.parse("src/forum16479976/input.xml"); 

     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 
     String health = (String) xpath.evaluate("/savedGame/player/stats/health", xml, XPathConstants.STRING); 
     System.out.println(health); 
    } 

}