2013-06-06 3 views
1

вот мой код:java.lang.ClassCastException, DeepNodeListImpl не может быть брошен

public void Login() { 
    try{ 
     DocumentBuilderFactory builderfactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = builderfactory.newDocumentBuilder(); 

     File path = new File("src/dataPengguna/dataPengguna.xml"); 

     Document doc = db.parse(path); 

     Element pengguna = (Element) doc.getElementsByTagName("pengguna"); 

     NodeList list = pengguna.getElementsByTagName("user"); 

     for (int i = 0; i < list.getLength(); i++) { 
      Element user = (Element) list.item(i); 
      Node username = user.getElementsByTagName("username").item(i); 
      Node password = user.getElementsByTagName("password").item(i); 

      if(loginuser.getText().equals(username.getTextContent()) 
       && loginpass.getText().equals(password.getTextContent())){ 
       JOptionPane.showMessageDialog(rootPane, "welcome"); 
      } 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 

    } 
    } 

вот мой XML:

 <?xml version="1.0" encoding="UTF-8"?> 
    <pengguna> 

     <user> 
     <nama>septian</nama> 
     <username>septiansykes</username> 
     <password>1234</password> 
     <status>belumpinjam</status> 
     </user>  

     <user> 
     <nama>koko</nama> 
     <username>kokosan</username> 
     <password>12er</password> 
     <status>belumpinjam</status> 
     </user> 

     <user> 
     <nama>tamrin</nama> 
     <username>tamrincs</username> 
     <password>gt234</password> 
     <status>belumpinjam</status> 
     </user> 

    </pengguna> 

и вот моя ошибка:

java.lang.ClassCastException:com.sun.org.apache.xerces.internal.dom.DeepNodeListImpl cannot be cast to org.w3c.dom.Element 

Я пытаюсь получить элемент в файле xml, я хочу проверить имя пользователя и пароль элемента, но есть ошибка в классе cast, это se эм трудно для меня, ... спасибо, прежде чем

ответ

4

Это проблема:

Element pengguna = (Element) doc.getElementsByTagName("pengguna"); 

getElementsByTagName не возвращает один элемент - он возвращает несколько элементов. Вы, наверное, хотите что-то вроде:

NodeList penggunas = doc.getElementsByTagName("pengguna"); 
if (penggunas.getLength() != 1) { 
    // Handle this - e.g. throw an exception 
} 
Element pengguna = (Element) penggunas.item(0); 

EDIT: Позже вы получили ошибку здесь:

Node username = user.getElementsByTagName("username").item(i); 
Node password = user.getElementsByTagName("password").item(i); 

Это должно быть:

Node username = user.getElementsByTagName("username").item(0); 
Node password = user.getElementsByTagName("password").item(0); 

Вы уже в user элемент - так что вы всегда хотите первые username и password элементов внутри этого элемента. В противном случае вы запрашиваете второй элемент username во втором элементе user, третий элемент username в третьем элементе user и т. Д. Нумерация относится к элементу, в котором вы находитесь, а не к некоторому глобальному счету.

+0

+1 Я не буду добавлять кода на мой ответ, как ваши содержит действительные один, чтобы решить Проблема: – eternay

+0

Да, его решение, но алгоритм для (i = 0; i zeptyan

+0

@zeptyan: Это потому, что у вас есть еще одна ошибка - я отредактирую свой ответ, чтобы показать это. –

1

getElementByTagName() возвращает NodeList, и вы пытаетесь направить его на Element. Эта линия является некорректной и даст вам ClassCastException:

Element pengguna = (Element) doc.getElementsByTagName("pengguna"); 
0

Великий пост, это решение работает:

Node node2 = (Node) element.getElementsByTagName("eventType").item(0); 

System.out.println("-----------------"+node2.getTextContent()); 
+0

Не могли бы вы немного расширить свой ответ (возможно, редактирование в более удобный формат), поэтому вы включаете детали, которые не рассматриваются в других ответах? – DarkCygnus