如何按照它们在XML文档中出现的顺序检索节点的子节点?

时间:2014-04-24 11:18:07

标签: java xml dom

我正在使用DOM解析器来访问XML文档并检索一些值。问题是,虽然我需要按照它们在XML中出现的确切顺序加载列表中的值,但解析器会以随机顺序返回子节点的值。

这是我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<scene id="mainMenu">
<sprite src="menubackground.png" position="0 0 0 0 0 0 200 200" visibility="true" name="background"/>
</scene> 
</xml>

和我正在使用的代码:

public class readXML2 {


public static void main(String [ ] args){
    String[] temp = new String[4];
    String sceneId = "mainMenu";
    Document doc;
    List<Node> sceneItems = new ArrayList<Node>();
    DocumentBuilder builder;
    File file = new File("C:\\Users\\manolaki\\Desktop\\assetsBACK.xml");

    try{
        builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        doc = builder.parse(file);
        doc.getDocumentElement().normalize();


    for (int h = 0; h < doc.getElementsByTagName("scene").getLength(); h++){ 
        if (doc.getElementsByTagName("scene").item(h).getAttributes().getNamedItem("id").getNodeValue().equals(sceneId)){
            for (int t=0; t< doc.getElementsByTagName("scene").item(h).getChildNodes().getLength(); t++ )
                if (doc.getElementsByTagName("scene").item(h).getChildNodes().item(t).getNodeType() != Node.TEXT_NODE)
                    sceneItems.add(doc.getElementsByTagName("scene").item(h).getChildNodes().item(t));
        }
    }



    for (int i=0; i <sceneItems.size(); i++){
        for (int j=0; j < 4/*sceneItems.get(i).getAttributes().getLength()*/; j++){
            temp[j] = sceneItems.get(i).getAttributes().item(j).getNodeValue();
            System.out.println(temp[j]);
            }
        }
    }catch (Exception e){ e.printStackTrace();  }


}

}

值在控制台中显示如下:

background
0 0 0 0 0 0 200 200
menubackground.png
true

但我需要这个:

 menubackground.png
 0 0 0 0 0 0 200 200
 true
 background

我认为DOM在树形结构中读取XML,但我不确定它的工作原理是什么以及我如何能够以正确的顺序为不同的子节点提供正确的值。

2 个答案:

答案 0 :(得分:1)

根据XML规范,元素的属性是名称/值对的 set ,没有定义的顺序。解析器或DOM API可以按照它想要的任何顺序自由返回它们,事实上NamedNodeMap的JavaDoc声明

  

NamedNodeMap未按任何特定顺序维护。实现NamedNodeMap的对象中包含的对象也可以通过序数索引访问,但这只是为了方便枚举NamedNodeMap的内容,并不意味着DOM指定了一个命令。这些节点。

您可以将NamedNodeMap转储到List或数组中,并按节点名称按字典顺序排序,这样可以为所有元素提供一致的顺序,但是无法知道顺序其中属性是通过DOM API在原始XML源中指定的。

答案 1 :(得分:0)

如果您需要订单,请使用实际的子元素,而不是属性,如下所示:

<sprite>
 <src>menubackground.png</src>
 <position>0 0 0 0 0 0 200 200</position>
 <visibility>true</visibility>
 <name>background</name>
</sprite>

(如果您不能定义XML的结构,那么您可以尝试自己实现一个简单的解析器来解决设计缺陷 - 如果在输入中不期望高级XML功能。)

编辑: 如何将属性加载到java对象中,然后可以根据需要输出它们。