2013-08-01 2 views
-3

У меня есть эта строка идет из моей базы данных:разбор строки в ArrayList элемент

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

мне нужно, чтобы разобрать его и добавить:

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

Он должен закончить тем, что, как это:

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

Я использовал следующий метод, но не работает правильно. У кого-нибудь есть способ сделать это?

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 ""; 
} 
+1

выглядит как у вас есть XML. попробуйте googling «java parse xml» – Tala

+1

@ user2642549 вы пытались выяснить, почему это не сработало, вместо того, чтобы просить новый код ... Если новый второй код не будет работать, вы попросите его третий. например. Если у вас возникли проблемы с кодом, попробуйте исправить это. Тем не менее .. Что вы подразумеваете под 'Это должно выглядеть так: user [1] = {name =" John ", surname =" Shena ", ...}' – aProgrammer

+0

Stackoverflow отличается от других сайтов QA mate, здесь if вы ошибаетесь, другие начнут кричать на вас. Я просто информировал вас о том, как работает SO. Я не отклонил ваш вопрос, поскольку я знаю его подлинный вопрос ... Я пытался помочь, но не мог получить строку, о которой я упоминал в комментарии. и их я прочитал ваш ответ на @Tala ... – aProgrammer

ответ

1

1 - моделировать использование класс:

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 - Создание обработчика путем расширения 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 - Написать парсер для файла xml

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 - Тест анализатор

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); 
    } 
} 
0

Если вы хотите разобрать XML, вы можете использовать синтаксический анализатор XML. Это может помочь вам: Java:XML Parser