2017-08-27 10 views
1

その答えは、むしろ単純になるだろうと私は信じています。しかし、私は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以外のフォルダにアクセスできないのか分かりません。

答えて

0

この問題は、コードが同じ名前のノードを一度に受信していることが原因です。しかし、this answer(StackOverflow |直接の子エレメントのみを名前で取得する)で提案されているのと同様のことを行うことで、直系の子供を得ることができます。そこでは、現在のレベルだけをループするために、.getFirstChild().getNextSibling()を利用します。

関連する問題