0

I have some information stored in XML, and I need to parse XML and store some of the values in Hashmap. Here is the XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<section ID="1">
    <Room>Room1</Room>
    <Capactiy>25</Capactiy>
    <Approval_Mode>personally</Approval_Mode>
    <Building>Building1</Building>
    <Address>Streer, 1. Stock, links</Address>
    <Room_Number>ZA0115</Room_Number>
    <CoordLt>16.412094</CoordLt>
    <CoordLn>48.19719</CoordLn>
</section>
<section ID="2">
    <Room>Room2</Room>
    <Capactiy>120</Capactiy>
    <Institute>E401</Institute>
    <Approval_Mode>personally</Approval_Mode>
    <Building>Building2</Building>
    <Address>Street 2, Building2, Stiege 7, 1.Stock</Address>
    <Room_Number>AH0105</Room_Number>
    <CoordLt>16.369865</CoordLt>
    <CoordLn>48.199006</CoordLn>
</section>
----

I want that key be:Room1 and values: 16.412094,48.19719 (example for Section ID=1)

That is example for first section.I have more than 100 section so I would like to store key and values for every section like I explained for the first example.

Output would be:

Room1: 16.412094,48.19719; Room2: 16.369865,48.199006;

Room3: 16,48; . . . Room100: 16,49;

Can anyone help me?

Here is my code:

import java.io.File; 
import java.sql.ResultSet;
import java.util.HashMap; 
import org.xml.sax.*; 
import org.xml.sax.helpers.DefaultHandler; 
import javax.xml.parsers.SAXParserFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 

public class XML extends DefaultHandler  
{ 
static HashMap<StringBuffer, String> hashMap; 
String elementName; 
StringBuffer elementValue;
private HashMap<String, String> newMap; 
public static void main(String[] args) 
{ 
DefaultHandler handler = new XML(); 
SAXParserFactory factory = SAXParserFactory.newInstance(); 
try 
{ 
hashMap = new HashMap<StringBuffer, String>(); 
//out = new OutputStreamWriter(System.out, "UTF8"); 
SAXParser saxParser = factory.newSAXParser(); 
saxParser.parse(new File("xml1.xml"), handler); 
System.out.println(hashMap); 
} 
catch(Throwable t) 
{ 
t.printStackTrace(); 
} 
System.exit(0); 
} 


public void startElement(String namespaceURI, String sName, String qName, Attributes    attrs) 
throws SAXException 
{ 
String eName = sName; 
if("".equals(eName)) eName = qName;

elementName = eName; 
if(attrs != null) 
{ 
for(int i = 0; i < attrs.getLength(); i++) 
{ 
String aName = attrs.getLocalName(i); 
if("".equals(aName)) aName = attrs.getQName(i); 

} 
} 
} 

public void endElement(String namespaceURI, String sName, String qName) 
throws SAXException 

{ 
String eName = sName; 
if("".equals(eName)) eName = qName; 

if(eName.equals(elementName)) 

hashMap.put(elementValue,""+ elementName );
elementValue = null;  
} 

public void characters(char[] ch, int start, int length) 
throws SAXException 
{ 
String str = new String(ch, start, length); 
if(elementValue == null) 
elementValue = new StringBuffer(str); 
else 
elementValue.append(str); 
} 
}

With this code I don't get desired output. output is: Room=Room1, Capacity=25......

5
  • Yes, it is Java question..I am sorry about the tag.I forgot. Commented Aug 6, 2012 at 10:11
  • 1
    Welcome to Stack Overflow! We encourage you to research your questions. If you've tried something already, please add it to the question - if not, research and attempt your question first, and then come back. Commented Aug 6, 2012 at 10:18
  • As this is a very straight forward question I am quite sure you haven't tried anything by yourself. go learn how to read XML document in java (Google it) then populate the hashmap however you like. Commented Aug 6, 2012 at 10:54
  • Thank you for your advice. I did that already and I parsed xml into hashmap, but I don't get desired output. I will post my code. Commented Aug 6, 2012 at 12:02
  • Please don't use a StringBuffer when you can use a StringBuilder. Commented Aug 13, 2012 at 8:02

2 Answers 2

2

Assume your xml file is "c:/test.xml"

Then use the following code to read and put into a hash map in in the following format as you said
key=Roomnumber value=CoordLt,CoordLn

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.spi.DirStateFactory.Result;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class xml {
    public static void main(String[] args) 
    {
        HashMap<String,String>hMap=new HashMap<String, String>();
        File file=new File("c:/test.xml");

        if(file.exists())
        {
           DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
            try
            {
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document document=builder.parse(file);
                Element documentElement=document.getDocumentElement();
                NodeList sList=documentElement.getElementsByTagName("section");
                if (sList != null && sList.getLength() > 0)
                {
                    for (int i = 0; i < sList.getLength(); i++)
                    {
                        Node node = sList.item(i);
                        if(node.getNodeType()==Node.ELEMENT_NODE)
                        {
                            Element e = (Element) node;

                            NodeList nodeList = e.getElementsByTagName("Room");

                            String roomName= nodeList.item(0).getChildNodes().item(0)
                                            .getNodeValue();


                             nodeList = e.getElementsByTagName("CoordLt");
                            String coordValues= nodeList.item(0).getChildNodes().item(0)
                                            .getNodeValue();


                            nodeList = e.getElementsByTagName("CoordLn");
                            coordValues=coordValues+","+ nodeList.item(0).getChildNodes().item(0)
                                            .getNodeValue();
                            hMap.put(roomName, coordValues);
                        }
                    }
                }
            } catch(Exception e){
                System.out.println("exception occured");
            }
        }else
        {
            System.out.println("File not exists");
        }

    }
}
Sign up to request clarification or add additional context in comments.

Comments

0

If you transform the XML using this xslt (which can be done in Java) you get your desired output, If someone sle knows howto load in a hashmap you'll be fine.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" indent="no" omit-xml-declaration ="yes" />

    <xsl:template match="/sections">
            <xsl:apply-templates select="section"/>
    </xsl:template>

  <xsl:template match="section" xml:space="default">
    <xsl:apply-templates select="Room"/>
    <xsl:text>:</xsl:text>
    <xsl:apply-templates select="CoordLt" />
    <xsl:text>,</xsl:text>
    <xsl:apply-templates select="CoordLn"/>
    <xsl:text>;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.