Seite 1 von 2
Java SAX Parser
Verfasst: 7. Dez 2013, 20:00
von Blue.Shark
Meine Aufgabe ist es, bestimmt Elemente mit bestimmten Attibuten aus einer XML-Datei mit Java auszulesen. Ich habe dann etwas im Internet geschaut und mich für den SAX Parser entschieden, da er scheinbar schneller ist und nicht das gesamte XML-Dokument lesen muss. Jetzt habe ich mich mit diversen Internet seiten etwas eingearbeitet und stelle fest, dass bei der Funktion
Code: Alles auswählen
public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {...}
trotzdem ALLE Elemente gelesen werden.
Ich bin am verzweifeln, ich finde nichts im Internet wie ich einfach nur einen Teil einer XML-Datei auslesen kann.
Also ich möchte z.b. bei folgender XML-Datei
Code: Alles auswählen
<test x="1">hello</test>
<test x="1234">hallo</test>
<test>halloooo</test>
<test2 x="1234">hi</test2>
nur den Inhalt des Elements "test" mit dem Attribut "1234" auslesen (also "hallo").
Vielleicht gibt es ja unter euch welche die sich mit diesem Thema schon beschäfiigt haben und mir helfen können.
Re: Java SAX Parser
Verfasst: 7. Dez 2013, 23:08
von bwoebi
@RageQuit:
http://stackoverflow.com/a/1732454/2153758 So viel dazu.
@Blue: Dein Parser, egal welchen du nutzt, muss ja zuerst mal das XML parsen um herauszufinden wo das entsprechende Element ist. Selbst wenn du Regex nutzen würdest, muss dein Regex noch immer zuerst den String lesen zum matchen. (Klar, es wird etwas billiger wenn das gesuchte Muster am Anfang zu suchen ist…)
Um einen Parser kommst du da nicht herum wenn es einigermaßen dynamisch sein soll.
Re: Java SAX Parser
Verfasst: 7. Dez 2013, 23:47
von bwoebi
Ja, auf XPath oder ähnliches kommt es wohl raus.
In der Regel kannst du aber davon ausgehen dass Beispiele zu sehr vereinfacht sind.
Unter anderem kann das XML auch so aussehen:
Code: Alles auswählen
<test value="a="b="c">text</test><test a="b=">text2</test>
Und naja such mal nach Attribut a gleich "b="… Regex failt hier in der Regel einfach mal… es matcht das erste Tag statt des Zweiten^^.
Re: Java SAX Parser
Verfasst: 8. Dez 2013, 12:41
von Blue.Shark
RageQuit hat geschrieben:Wie gesagt, solange wir nicht den genauen Aufbau kennen, ist es sinnlos darüber zu philosophieren

Warten wir erst mal ab, was der Hai dazu sagt.
Der Aufbau ist wie ich oben in meinem ersten Post geschrieben hab, also es sind sehr viele Tags, die maximal 2 Attribute hben, wobei die Attribute einfache Zahlen sind.
Die XML-Datei ist ewig lang, ca. 400 Zeilen, deshalb ist es wichtig, dass ich nicht alles einlesen muss, sondern nur das, was ich wirklich brauche.
Ich bin totaler Anfänger in Java, deswegen wäre so ein fertiger Parser, wo ich nur sagen muss was er mir holen muss, sehr toll.
Re: Java SAX Parser
Verfasst: 8. Dez 2013, 23:23
von Blue.Shark
Ok, danke. Ich werde mich da mal einlesen.
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 19:00
von Blue.Shark
Ich hab noch eine kurze Frage, wäre nett, wenn die mir jemand beantworten könnte:
Ich habe eine Klasse A:
Code: Alles auswählen
public class A{
private String [] var= new String[10];
}
und eine Klasse B:
Code: Alles auswählen
public class B{
public static void main(String[] args) {
int x = 10;
}
}
Wie erreiche ich, dass das Array var der Klasse A nicht fix auf 10 ausgelegt wird, sondern auf den Wert x von der Klasse B?
Oder geht das garnicht?
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 19:08
von bwoebi
Du initialisierst deine Klassenvariable var nicht automatisch, sondern im Konstruktor:
Code: Alles auswählen
public class A {
private String[] var;
A(int strSize) {
this.var = new String[strSize];
}
}
public class B{
public static void main(String[] args) {
int x = 10;
/* zuweisen und so… */ new A(x);
}
}
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 19:30
von Blue.Shark
Ok perfekt, danke bwoebi!
Vielleicht noch eine Frage: Wenn ich ein Klassenarray test von der Klasse A mit 100 Elementen anlege, also:
kommt ein Fehler, d.h. das geht irgendwie nicht. Gibts da ne andere Art?
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 19:49
von -Mafiosi-
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 19:56
von Blue.Shark
RageQuit hat geschrieben:Was soll das setX bitte bewirken? Oder anders: Was möchtest du erreichen? Ich _vermute_, du möchtest an der Stelle 0 im Array den Wert 2 setzen. Das geht so:
test[0] = 2;
Btw, das ist die beste Fehlerbeschreibung, die es gibt. "Es kommt ein Fehler."
Keine weiteren Fragen.
Nein, so meinte ich das nicht. Mit dem ersten Befehl möchte ich 100 Objekte der Klasse A anlegen. Dann will ich beim Objekt 0 den wert X auf 2 setzen.
Naja der Fehler ist nur dass eine Exception (java.lang.NullPointerException) geworfen wird.
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 20:18
von Blue.Shark
Aber ich habe doch das Objekt mit "new A" erzeugt.
Ich brauche 100 Objekte von Klasse A. Deshalb will ich anstatt dem hier:
Code: Alles auswählen
A test1 = new A;
A test2 = new A;
A test3 = new A;
A test4 = new A;
A test5 = new A;
[...]
Das hier machen, also ein Klassen-array:
Aber das klappt nicht, obwohl test[0] ein Objekt der Klasse A ist.
PS: Bisher mit C und C++. Ich habe bisher immer alles Nicht-Objektoroentiert programmiert, deshalb tuh ich mich da grad etwas schwer.
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 20:28
von Rober
RageQuit hat geschrieben:Ok, also lies dir mal das durch, was dir der mafiosi da geschickt hat.
Hast du dir Seite überhaupt angeguckt? Du hast am Anfang nur nen "Container"´, in den 100 A-Elemente reinpassen.
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 20:30
von bwoebi
Du erzeugst ein ein Array mit Platz für hundert Objekte der Klasse A und keine hundert Objekte der Klasse A.
eine kleine for Schleife bis hundert brauch es nach der Initialisation des Arrays auch noch um die einzelnen Objekte zu kreieren.
Code: Alles auswählen
A[] test = new A [100];
int i;
for (i = 0; i < 100; i++) test[i] = new A;
/* Und JETZT kannst du die Elemente des Arrays benutzen */
test[0].setX(2);
(Hast du C++ wirklich ohne Objekte genutzt? aah!?)
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 20:30
von -Mafiosi-
Hast du meinen Link ignoriert?
Statt deine Zeit zu verweden, hier immer die gleiche Frage zu stellen, die dort ganz genau beantwortet wird, aber ich kopier dir nochmal hier rein, was dort steht.
public class MyClass
{
public static void main(String[] args)
{
int[] array = new int[2]; // Array anlegen
array[0] = 10; // Wet zuweisen
array[1] = 20;
}
}
(hier speiziell für int-werte, aber einfach analog dazu)
Re: Java SAX Parser
Verfasst: 9. Dez 2013, 20:42
von Blue.Shark
Nein, hab ihn nichz ignoriert. Die Seite kannte ich davor schon. Das löst aber immernoch nicht mein Problem. Denn wenn ich dein Beispiel als Klasse ersetze, hätte ich ja bei der Zuweisung
Objekt[0] = 10.
Man kann einem Objekt keine Zahl zuweisen, sondern nur zu den Atrributen des Objekts.