【问题标题】:Java + XML | Accessing a specific Node from within a deep tree of same-named NodesJava + XML |从同名节点的深层树中访问特定节点
【发布时间】:2017-08-27 22:28:42
【问题描述】:

所以,我相信答案可能会相当简单。虽然,我一直试图解决这个问题一个多星期,但没有运气。我正在尝试为桌面/操作系统模拟器游戏创建文件系统。

目前,文件系统看起来像这样:(稍微精简)

<system>
    <info> <!-- Default information/data for this system -->
        <top dir="/"/>
    </info>

    <files> <!-- File and Directory structure for this system -->
        <dir name="home" owner="0" group="0" ownerp="rwx" groupp="r-x" otherp="r-x">
            <dir name="cyanite" owner="1000" group="1000" ownerp="rwx" groupp="rwx" otherp="r-x">
                <dir name="folder" owner="1000" group="1000" ownerp="rwx" groupp="rwx" otherp="r-x">
                    <dir name="folder" owner="1000" group="1000" ownerp="rwx" groupp="rwx" otherp="r-x">
                        <dir name="folder" owner="1000" group="1000" ownerp="rwx" groupp="rwx" otherp="r-x">
                        </dir>
                    </dir>
                </dir>
            </dir>
        </dir>
        <dir name="bin" owner="0" group="0" ownerp="rwx" groupp="r-x" otherp="r-x">
        </dir>
        <dir name="etc" owner="0" group="0" ownerp="rwx" groupp="r-x" otherp="r-x">

        </dir>
        <dir name="usr" owner="0" group="0" ownerp="rwx" groupp="r-x" otherp="r-x">
        </dir>
    </files>
</system>

这是我试图从文件中读取的草率 WIP 代码:

System.out.println(fileNavigator.getDirectory("home"));

public ArrayList<String> getDirectory(String path) {
    Document doc = ExitParser.getDocFromZip(system); // This loads the save file and returns the doc
    NodeList dataList = doc.getElementsByTagName("files");
    NodeList dataList2 = parsePath(dataList, path);
    ArrayList<String> stringList = new ArrayList<String>();
    try {
        for(int i=0;  i < dataList2.getLength(); i++) {
            Node dataItem = dataList2.item(i);
            Element elementDataItem = (Element)dataItem;
            stringList.add(elementDataItem.getAttribute("name"));
        }
    } catch (NullPointerException e) {
        stringList.add("NullPointerException");
    }
    return stringList;
}

public NodeList parsePath(NodeList nodelist, String path) {
    Document doc = ExitParser.getDocFromZip(system); // This loads the save file and returns the doc
    NodeList dataList = doc.getElementsByTagName("info");
    if (path.startsWith(ExitParser.getAttributeValue(dataList, "top", "dir"))) {
        // This simply grabs "top" from the FileSystem <info> area and strips it.
        path.replaceFirst(Pattern.quote(ExitParser.getAttributeValue(dataList, "top", "dir")), "");
    }
    List<String> pathList = new ArrayList<String>();
    if (path.contains("/")) {
        pathList = new ArrayList<String>(Arrays.asList(path.split("/")));
    } else if (path.contains("\\")) {
        pathList = new ArrayList<String>(Arrays.asList(path.split("\\")));
    } else {
        pathList.add(path);
    }


    for (String string : pathList) {
        System.out.println(string);
        nodelist = ExitParser.getNextSetAttr(nodelist, string);
    }


    return nodelist;
}

public static NodeList getNextSetAttr(NodeList data, String attrName) {
    try {
        for(int i=0;  i < data.getLength(); i++){
            Element dataElement = (Element)data.item(i);
            NodeList nodeList = dataElement.getElementsByTagName("dir");
            Element nodeElement = (Element)nodeList.item(0);
            if(nodeElement.hasAttribute("name")){
                if (nodeElement.getAttribute("name").contains(attrName)) {
                    System.out.println(true);
                    return nodeList;
                }
            }
        }
    }
    catch(Exception ex) {
        System.out.println(ex.getMessage());
    }
    return null;
}

使用上面的代码,我希望输出为[cyanite],但我得到的是[home, cyanite, folder, folder, folder, bin, etc, usr]

如果我将System.out.println(fileNavigator.getDirectory("home")); 更改为System.out.println(fileNavigator.getDirectory("home/cyanite"));,那么我会得到[cyanite]。如果我将"home/cyanite" 更改为"bin",我会得到[NullPointerException]

对于[home, cyanite, folder, folder, folder, bin, etc, usr],问题似乎是被添加到列表中的父节点(即 home、bin 等、usr)以及所有子节点(即:文件夹、文件夹、文件夹)的问题。在我的用例中,我只希望获得当前节点的子节点,而不是其节点的子节点。

不过,我不确定为什么我无法访问除 home 之外的其他文件夹。

【问题讨论】:

    标签: java xml xml-parsing


    【解决方案1】:

    这个问题是由于代码同时接收所有同名节点造成的。但是,只能通过执行类似于this answer 中建议的操作来获取直接子元素(StackOverflow | Get XML only immediate children elements by name)。在那里,他们利用.getFirstChild().getNextSibling() 来只循环当前关卡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多