Java XML:获取嵌套元素

时间:2013-05-10 10:14:57

标签: java xml

我正在编写一个简单的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。

2 个答案:

答案 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来对象转换,请使用序列化器。