我正在编写一个简单的Java游戏,我想将播放器数据保存到XML编码的保存文件中。目前我正在发现Java XML DOM API,我有一个简短的问题。
假设我有以下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。
答案 0 :(得分:3)
您可以使用JDK / JRE中包含的javax.xml.xpath
API轻松地从您的文档中获取数据。
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);
}
}
答案 1 :(得分:1)
如果你这么做,你可以让simple serializer来处理。你编写对象和读取对象(如播放器等),序列化器负责XML部分。当你专注于游戏开发时。
从DOM手动解析XML时,您已经使用的逻辑不能再变小。这是因为,DOM提供了非常非常基本的导航方法:列出子节点并选择其中一个,重复直到到达所需的节点。这可能适用于轻量级XML,但是当您解析具有许多标记级别的复杂结构时,很快就会变成一场噩梦。
另一种更快的方法是streaming,仍然是更复杂的XML结构,解析器代码也是如此。
如果您只需要查询特定节点的XML,那么XPATH也很棒。但是如果你需要完整的xml来对象转换,请使用序列化器。