【问题标题】:Populating hashmap from xml(java)从 xml(java) 填充 hashmap
【发布时间】:2016-12-04 11:54:50
【问题描述】:

我的 xml 看起来像:

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

当我在解析 xml 时尝试填充 hashmap 时出现问题。我使用四个哈希图来保存不同级别的信息。所以最终的hashmap由较低级别的hashmap组成,例如setup、group和light,每个级别的属性是该级别各个map的key。

    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 的 hashmap 也会自动更新。因此,当较低级别的 hashmap 被覆盖时,以前的条目会丢失。

我知道哈希图中的“键”指向值的位置(这里是另一个哈希图)。因此,我很困惑,接下来可以做什么来将所有 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");
    }
    }

谢谢提前!!

【问题讨论】:

    标签: java xml xml-parsing hashmap java-8


    【解决方案1】:

    我认为你走错了路。如果您花时间真正将这些数据解析为对象,那么我将创建一个 真实 模型;而不是使用字符串映射。你看,你目前的方法是非常笨拙。那些地图的地图不仅难以填充;它们也将在以后难以使用。尽管它不是直接“可见的” - 您的 XML 数据是结构化的。通过“盲目地”将其推送到地图中,您正在使很多这种结构更难获得。

    我的意思是:在最低级别上,您正在处理 Lights。那么为什么不创建一个包含相应属性的 Light class 呢?但不是作为原始字符串,而是已经转换为它们更具体的类型。然后你不会将灯光推入地图,而是推入 List - 因为它们已经按该顺序出现。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 2011-12-31
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多