Parsowanie XML za pomocą biblioteki Digester

0

Witam,
Próbuję napisać prosty program parsujący plik XML za pomocą biblioteki Digester fundacji Apache. (http://commons.apache.org/digester/). Kod wydaje się być w porządku, zgadza się z przykładami znalezionymi w necie.

Oto zawartość pliku xml:

<Osoba>
<DaneOsobowe>
<Imie>Jan</Imie>
<Nazwisko>Iksisnki</Nazwisko>
</DaneOsobowe>
</Osoba>

Oto kod mojego programu:

import org.apache.commons.digester.Digester;
import java.io.*;
import org.apache.commons.io.FileUtils;

public class Test {
	
    public static void main(String[] args) {
    try{
    File f = new File("dane.xml");
    String content = FileUtils.readFileToString(f);
    Digester dig =  new Digester();
 	dig.setValidating(false);
 	dig.addObjectCreate("*/DaneOsobowe", Person.class);
 	dig.addBeanPropertySetter("*/DaneOsobowe/Imie", "name");
 	dig.addBeanPropertySetter("*/DaneOsobowe/Nazwisko", "surname");
	Person person = (Person)  dig.parse(content);
    }
        catch (Exception ex) {ex.printStackTrace();}
    }
    
  public class Person{
  String name;
  String surname;
  }
}
 

A oto komunikat jaki otrzymuję od kompilatora:

 
java.net.MalformedURLException: no protocol: <Osoba>
   <DaneOsobowe>
      <Imie>Jan</Imie>
      <Nazwisko>Iksisnki</Nazwisko>
   </DaneOsobowe>
</Osoba>
    at java.net.URL.<init>(URL.java:583)
    at java.net.URL.<init>(URL.java:480)
    at java.net.URL.<init>(URL.java:429)
    at org.apache.commons.digester.Digester.createInputSourceFromURL(Digester.java:2092)
    at org.apache.commons.digester.Digester.parse(Digester.java:1934)
    at Test.main(Test.java:25)

Process completed.

Co może być przyczyną? Czy ktoś z forumowiczów miał tego typu problemy?

0

Nie wiem co robi i do czego jest ta biblioteka (jutro się dowiem), ale wiem co robisz źle. Pierwszy rzut oka na dokumentację pokazuje, że w metodzie parse ma być podany URL do pliku albo plik. Czyli u ciebie powinno być:

File f = new File("dane.xml");
       Digester dig =  new Digester();
      ...
        Person person = (Person)  dig.parse(f);
0

Niestety w metodzie parse powinien być chyba String (tak podpowiada Netbeans oraz tak było to robione w przykładach jakie znalazłem w sieci).
W każdym razie kiedy robię tak:

File f = new File("dane.xml");
       Digester dig =  new Digester();
      ...
        Person person = (Person)  dig.parse(f);

Kompilator wywala taki komunikat:

gru 02, 2011 12:01:53 AM org.apache.commons.digester.Digester startElement
SEVERE: Begin event threw exception
java.lang.IllegalAccessException: Class org.apache.commons.digester.ObjectCreateRule can not access a member of class Person with modifiers ""
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95)
    at java.lang.Class.newInstance0(Class.java:366)
    at java.lang.Class.newInstance(Class.java:325)
    at org.apache.commons.digester.ObjectCreateRule.begin(ObjectCreateRule.java:206)
    at org.apache.commons.digester.Rule.begin(Rule.java:175)
...

Kiedy próbuję ustawić obsługę wyjątku IllegalAccessException to kompilator zgłasza, że taki wyjątek już został obsłużony...

0
alfredoo90 napisał(a)

Niestety w metodzie parse powinien być chyba String (tak podpowiada Netbeans oraz tak było to robione w przykładach jakie znalazłem w sieci).

Podpowiada, bo możesz podać URL jako String, ale nie zawartość pliku. Teraz masz inny błąd. Tylko zgaduję, że musisz w klasie Person dopisać gettery i settery.

0

To co chodnik. Jeśli masz addBeanPropertySetter, to klasa Person powinna mieć takie właśnie beanowe settery (w twoim przypadku setName, setSurname). Z tego wyjątku też wynika, że chyba wystarczą same pola, ale publiczne (do domyślnych nie ma dostępu; chyba, bo nigdy nie próbowałem). Mimo wszystko, powinieneś trzymać się konwencji ziarenkowej.

0

Ustawiłem gettery i settery jak radziliście, wydaje mi się, że zrobiłem to dobrze, ale zamieszczam kod do sprawdzenia jak coś. Niestety dalej otrzymuję ten sam błąd. Aha i jako parametru metody parse() używam już pliku tak jak na to zwróciliście uwagę.

   public class Person{
  String name;
  String surname;
  
    public String getName() { return name; }
    public void setName(String newName){
        this.name = newName;
    }

    public String getSurname() { return surname; }
    public void setSurname(String newSurname){
        this.surname = newSurname;
    }

  }
0

Weź klasę Person zrefaktoruj do osobnego plik Person.java

0

DZIAŁA :D Wielkie dzięki, koniec mojej udręki z tym parsowaniem. Przynajmniej mam taką nadzieję :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.