2013-05-10 130 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); 
    } 

}