2016-12-04 6 views
2

私のXMLは次のようになります。私は、XMLを解析中にハッシュマップを移入しようとすると、の取り込みハッシュマップ(Java)の

<?xml version="1.0"?> 
<Grid id = 1> 
    <Setup id = "1"> 
     <Group name = "DrawingRoom"> 
      <Light id = "1"> 
       <name>Light1</name> 
       <type>ben</type> 
       <index>1</index> 
      </Light> 
      <Light id = "2"> 
       <name>Light2</name> 
       <type>crux</type> 
       <index>2</index> 
      </Light> 
      <Light id = "3"> 
       <name>Light3</name> 
       <type>let</type> 
       <index>3</index> 
      </Light> 
     </Group> 
     <Group name = "BedRoom"> 
      <Light id = "1"> 
       <name>Light1</name> 
       <type>let</type> 
       <index>4</index> 
      </Light> 
     </Group> 
    </Setup> 
    <Setup id = "2"> 
     <Group name = "ClubRoom"> 
      <Light id = "1"> 
       <name>Light1</name> 
       <type>let</type> 
       <index>1</index> 
      </Light> 
     </Group> 
    </Setup> 
</Grid> 

問題が表示されます。私は、それぞれ異なるレベルの情報を保持するために4つのハッシュマップを使用しています。最終的なハッシュマップはセットアップ、グループ、ライトのような下位レベルからのハッシュマップで構成され、各レベルの属性はそのレベルのそれぞれのマップのキーです。

public HashMap<String,String> lightContent = new HashMap<String,String>(); 
    public HashMap<String, HashMap<String,String>> groupContent = new HashMap<String, HashMap<String,String>>(); 
    public HashMap<String, HashMap<String, HashMap<String,String>>> setupContent = new HashMap<String, HashMap<String, HashMap<String,String>>>(); 
    public HashMap<String, HashMap<String, HashMap<String, HashMap<String,String>>>> gridContent = new HashMap<String, HashMap<String, HashMap<String, HashMap<String,String>>>>(); 

解析中に問題が発生するのは、ハッシュマップが更新されると自動的にそれらのハッシュマップを含むハッシュマップが更新されるためです。したがって、下位レベルのhashmapを上書きすると、前のエントリが失われます。

ハッシュマップの「キー」は値の場所を指していることを理解しています(ここでは別のハッシュマップです)。したがって、mは混乱します。次に、すべてのxmlデータをハッシュマップに取り出すために何ができるのでしょうか。この点であなたの助けを感謝します!

私は恐れていますが、この目的のために外部ライブラリを使用することはできません。関数は次のとおりです。

public void getSetupConfiguration() 
    { 
     try { 

      File fXmlFile = new File("D:\\SetupConfig.xml"); 
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
      Document doc = dBuilder.parse(fXmlFile); 
      NodeList nodeList = doc.getChildNodes(); 


      if (doc.hasChildNodes()) 
       { 
       for (int count1 = 0; count1 < nodeList.getLength(); count1++) 
        { 
        System.out.println(nodeList.getLength()); 
       Node gridNode = nodeList.item(count1); 
       if (gridNode.getNodeType() == Node.ELEMENT_NODE) 
        { 
        String presentNodeName = gridNode.getNodeName(); 
        // get node name and value 
    //     System.out.println("\nNode Name =" + presentNodeName); 

        if (presentNodeName.equalsIgnoreCase("Grid")) 
         { 
         if (gridNode.hasChildNodes()) 
          { 
          Node setupNode = gridNode.getFirstChild(); 
          while (setupNode != null) 
           { 
           if (setupNode.getNodeType() == Node.ELEMENT_NODE) 
            { 
            System.out.println(setupNode.getNodeName()); 
            //Getting group 
            Node groupNode = setupNode.getFirstChild(); 
            while (groupNode != null) 
             { 
             if (groupNode.getNodeType() == Node.ELEMENT_NODE) 
              { 
               System.out.println(groupNode.getNodeName()); 
              // Getting lights 
              Node lightNode = groupNode.getFirstChild(); 
              while (lightNode != null) 
               { 
               if (lightNode.getNodeType() == Node.ELEMENT_NODE) 
                { 
                System.out.println(lightNode.getNodeName()); 
                // Getting individual lights 
                Node lights = lightNode.getFirstChild(); 
                while (lights != null) 
                 { 
                 if (lights.getNodeType() == Node.ELEMENT_NODE) 
                  { 
                  lightContent.put(lights.getNodeName(), lights.getTextContent()); 
                  System.out.println("aaa"); 
                  } 
                  lights = lights.getNextSibling(); 


                 } 
                NamedNodeMap lightMap = lightNode.getAttributes(); 
                String lightId = ""; 
                // To get id of Light element 
                for (int i = 0; i < lightMap.getLength(); i++) 
                {          
                 Node lightItem = lightMap.item(i); 
                 lightId = lightItem.getNodeValue(); 
                } 

                groupContent.put(lightId, lightContent); 
                System.out.println(groupContent); 

                } 

                lightNode = lightNode.getNextSibling(); 

               }// Populating Light Node Ends 
              NamedNodeMap groupMap = groupNode.getAttributes(); 
              String groupName = ""; 

              for (int i = 0; i < groupMap.getLength(); i++) 
              {          
               Node lightItem = groupMap.item(i); 
               groupName = lightItem.getNodeValue(); 
              } 
              setupContent.put(groupName, groupContent); 
              System.out.println(setupContent); 
              } 
              lightContent.clear(); 
              groupContent.clear(); 
              System.out.println(lightContent); 
              groupNode = groupNode.getNextSibling(); 
             } 
            } 
           if (setupNode.getNodeType() == Node.ELEMENT_NODE) 
           { 
            NamedNodeMap setupMap = setupNode.getAttributes(); 
            String setUpId = ""; 

            for (int i = 0; i < setupMap.getLength(); i++) 
            {          
             Node lightItem = setupMap.item(i); 
             setUpId = lightItem.getNodeValue(); 
            } 
            gridContent.put(setUpId, setupContent); 
            System.out.println(gridContent); 
            setupContent.clear(); 
           } 

           setupNode = setupNode.getNextSibling(); 
           } 

          } 
//       gridNode = gridNode.getNextSibling(); 

          } 
        } 
       } 
      } 
      System.out.println(gridContent); 
      } 
      catch (Exception e) 
      { 
      e.printStackTrace(); 
      } 



     System.out.println("Wow"); 
    } 
    } 

ありがとうございます!

答えて

5

あなたは間違った経路をとっていると思います。あなたが実際にそのデータをオブジェクトに解析する時間を費やしたら、モデルを作成します。文字列のマップを使用する代わりに。あなたの現在のアプローチはです。極端にが不器用です。これらのマップマップは、ハードだけでなく、彼らはまた、後で使用するハードになるでしょう。直接「可視」ではありませんが、XMLデータは構造化です。そしてそれを「盲目的に」地図に押し込むことで、その構造体をたくさん作ります硬くを取得します。

私が言っていることは、最低レベルでライトを扱っていることです。ですから、クラスの対応する属性を含むライトを作成してみませんか?しかし生の弦ではなく、すでにより具体的なタイプに変換されています。そしてライトを地図にプッシュしないで、リストに入っています。彼らは既にその順番で入っています。

既存の技術(JAXBなど)を使用してXMLデータを「実際の」オブジェクトに変換する必要があります(here参照)。

関連する問題