2016-12-04 74 views
2

我的XML是这样的:当我尝试填充的HashMap在解析XML出现填充从XML(JAVA)的HashMap

<?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> 

问题。我使用四个hashmap来保存不同级别的信息。因此,最终的hashmap包含来自较低级别的hashmap,如设置,组和灯光,每个级别的属性都是该级别各个映射的关键。

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被覆盖时,以前的条目会丢失。

我知道hashmap中的“key”指向值的位置(这里是另一个hashmap)。因此,m感到困惑,接下来可以做什么来检索所有的xml数据到hashmap。感谢您在这方面的帮助!

恐怕,不能使用任何外部库来达到此目的。这里是功能:

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

我想你会走错路。如果您花时间真正将数据解析为对象,那么我会创建一个真实模型;而不是使用字符串地图。你看,你现在的做法是极其笨拙极其。那些地图贴图不仅需要hard才能填充;他们也会在稍后使用。虽然它不是直接“可见的” - 您的XML数据是结构化。通过将“盲目”推入地图,您正在制作很多结构难以获得的

我的意思是:在最底层,您正在处理灯光。那么为什么不创建一个包含相应属性的Light ?但不是原始字符串,而是已经转换为更具体的类型。然后,你不会将Lights推入地图,而是将其放入列表 - 因为它们已经按照该顺序进入。

然后您应该使用现有的等技术(如JAXB)将XML数据转换为“真实”对象 - 有关指导,请参阅here