5

我正在编写一个简单的 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 类?现在我必须投射每个节点。

在此先感谢,乔里。

4

2 回答 2

4

您可以使用javax.xml.xpathJDK/JRE 中包含的 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);
    }

}
于 2013-05-10T10:39:57.597 回答
1

如果你经常这样做,你可以让一个简单的序列化程序来处理它。您编写对象并读取对象(如播放器等),序列化程序负责 XML 部分。当您专注于游戏开发时。

在从 DOM 手动解析 XML 时,您已经使用的逻辑不能再小了。这是因为,DOM 提供了非常非常基本的导航方法:列出子节点并选择其中一个,重复直到到达所需的节点。这可能对轻量级 XML 有好处,但当您解析具有许多标记级别的复杂结构时,很快就会变成一场噩梦。

另一种更快的方法是流式传输,但 XML 结构越复杂,解析器代码也是如此。

如果您只需要查询特定节点的 XML,XPATH也很棒。但是,如果您需要完整的 xml 到对象的转换,请使用序列化程序。

于 2013-05-10T10:31:31.860 回答