【发布时间】: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