その答えは、むしろ単純になるだろうと私は信じています。しかし、私は1週間以上これを理解しようとしていて、運がなかった。私はデスクトップ/ OSシミュレータゲーム用のFileSystemを作成しようとしています。Java + XML |同じ名前のノードの深いツリーの中から特定のノードにアクセスする
現在、ファイルシステムは次のようになります(ストリップダウンわずか)
<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]
の場合、すべての子ノード(つまり、フォルダ、フォルダ、フォルダ)だけでなく、親ノードがリスト(ホーム、binなど、usr)に追加されると問題が発生するようです。私の使用例では、現在のノードの子ノードを取得するだけで、ノードの子ノードは取得しません。
なぜ、私はhome
以外のフォルダにアクセスできないのか分かりません。