-3

I have this string coming from my dataBase:

<user>
    <name>John</name>
    <surname>Shean</surname>
    <birthdate>1/1/1111</birthdate>
    <phone >(555) 444-1111</phone>
    <city>NY</city>
</user>

I need to parse it and add to:

arrayList<User>.(User(name,surname,...))

It should end up looking like this:

user[1]={name="John",surname="Shena",...}

I used the following method but it isn't working right. Does anyone have a method to will do this?

public User parseList(String array) {

    User user = new User();

    try {

        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

        URL u = new URL("xmldb:exist://192.168.1.71:8094/exist/xmlrpc/db/testDB/userInformation.xml");

        Document doc = builder.parse(u.openStream());

        NodeList nodes = doc.getElementsByTagName("user");

            Element element = (Element) nodes.item(0);

            user.setName(getElementValue(element, "name"));
            user.setSurname(getElementValue(element, "surname"));
            user.setBirthdate(getElementValue(element, "birthdate"));
            user.setPhone(getElementValue(element, "phone"));
            user.setCity(getElementValue(element, "city"));

            System.out.println(user);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return user;
}

protected String getElementValue(Element parent, String label) {
    return getCharacterDataFromElement((Element) parent.getElementsByTagName(label).item(0));
}

private String getCharacterDataFromElement(Element e) {
    try {
        Node child = e.getFirstChild();
        if (child instanceof CharacterData) {
            CharacterData cd = (CharacterData) child;
            return cd.getData();
        }
    } catch (Exception ex) {
    }
    return "";
}
Nate
  • 31,017
  • 13
  • 83
  • 207
ekrem777
  • 35
  • 2
  • 8
  • 1
    looks like you have xml. try googling "java parse xml" – Tala Aug 01 '13 at 14:48
  • 1
    @user2642549 did you try finding out why it didn't work instead of asking for new code... If new second code won't work you will ask for the third one.. Programming is not like that.. If you get some problem in code try to fix that. That said.. What you mean by `It should looks like: user[1]={name="John",surname="Shena",...}` – Amit Aug 02 '13 at 06:39
  • Stackoverflow is unlike other QA sites mate, here if you do mistake others will start shouting on you. I was just making you aware of how SO works. I havn't downvoted you question as I know its a genuine question... I was trying to help but couldn't get the line I mentioned in comment. and their I read your reply to @Tala... – Amit Aug 02 '13 at 10:42

2 Answers2

1

1 - model your use class:

package com.howtodoinjava.xml.sax;

/**
 * Model class. Its instances will be populated using SAX parser.
 * */
public class User
{
    //XML attribute id
    private int id;
    //XML element name
    private String Name;
    //XML element surname
    private String SurName;
    //...

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return Name;
    }
    public void setName(String Name) {
        this.Name = Name;
    }
    public String getSurName() {
        return SurName;
    }
    public void setSurName(String SurName) {
        this.SurName = SurName;
    }

    // [...]

    @Override
    public String toString() {
        return this.id + ":" + this.Name +  ":" +this.SurName ;
    }
}

2 - Build the handler by extending DefaultParser

package com.howtodoinjava.xml.sax;

import java.util.ArrayList;
import java.util.Stack;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class UserParserHandler extends DefaultHandler
{
    //This is the list which shall be populated while parsing the XML.
    private ArrayList userList = new ArrayList();

    //As we read any XML element we will push that in this stack
    private Stack elementStack = new Stack();

    //As we complete one user block in XML, we will push the User instance in userList
    private Stack objectStack = new Stack();

    public void startDocument() throws SAXException
    {
        //System.out.println("start of the document   : ");
    }

    public void endDocument() throws SAXException
    {
        //System.out.println("end of the document document     : ");
    }

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
    {
        //Push it in element stack
        this.elementStack.push(qName);

        //If this is start of 'user' element then prepare a new User instance and push it in object stack
        if ("user".equals(qName))
        {
            //New User instance
            User user = new User();

            //Set all required attributes in any XML element here itself
            if(attributes != null &amp;&amp; attributes.getLength() == 1)
            {
                user.setId(Integer.parseInt(attributes.getValue(0)));
            }
            this.objectStack.push(user);
        }
    }

    public void endElement(String uri, String localName, String qName) throws SAXException
    {
        //Remove last added  element
        this.elementStack.pop();

        //User instance has been constructed so pop it from object stack and push in userList
        if ("user".equals(qName))
        {
            User object = this.objectStack.pop();
            this.userList.add(object);
        }
    }

    /**
     * This will be called everytime parser encounter a value node
     * */
    public void characters(char[] ch, int start, int length) throws SAXException
    {
        String value = new String(ch, start, length).trim();

        if (value.length() == 0)
        {
            return; // ignore white space
        }

        //handle the value based on to which element it belongs
        if ("name".equals(currentElement()))
        {
            User user = (User) this.objectStack.peek();
            user.setName(value);
        }
        else if ("surname".equals(currentElement()))
        {
            User user = (User) this.objectStack.peek();
            user.setSurName(value);
        }
    }

    /**
     * Utility method for getting the current element in processing
     * */
    private String currentElement()
    {
        return this.elementStack.peek();
    }

    //Accessor for userList object
    public ArrayList getUsers()
    {
        return userList;
    }
}

3 - Write parser for xml file

package com.howtodoinjava.xml.sax;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class UsersXmlParser
{
    public ArrayList parseXml(InputStream in)
    {
        //Create a empty link of users initially
        ArrayList<user> users = new ArrayList</user><user>();
        try
        {
            //Create default handler instance
            UserParserHandler handler = new UserParserHandler();

            //Create parser from factory
            XMLReader parser = XMLReaderFactory.createXMLReader();

            //Register handler with parser
            parser.setContentHandler(handler);

            //Create an input source from the XML input stream
            InputSource source = new InputSource(in);

            //parse the document
            parser.parse(source);

            //populate the parsed users list in above created empty list; You can return from here also.
            users = handler.getUsers();

        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {

        }
        return users;
    }
}

4 - Test parser

package com.howtodoinjava.xml.sax;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;

public class TestSaxParser
{
    public static void main(String[] args) throws FileNotFoundException
    {
        //Locate the file OR String
        File xmlFile = new File("D:/temp/sample.xml");

        //Create the parser instance
        UsersXmlParser parser = new UsersXmlParser();

        //Parse the file Or change to parse String
        ArrayList users = parser.parseXml(new FileInputStream(xmlFile));

        //Verify the result
        System.out.println(users);
    }
}
Alexandre Ouicher
  • 856
  • 1
  • 9
  • 15
0

If you want to parse XML, you can use an XML parser. This may help you: Java:XML Parser

Community
  • 1
  • 1
JDong
  • 2,304
  • 3
  • 24
  • 42